株式会社オージス総研
ES事業部PDチーム
国正@Objyチーム
with
Objyチームメンバ
・目次
1.始めに
2.RDBで・・・いいの?
3.ODB Pros & Cons
3.1.ODBってここがすごい
3.2.ODBってここがちょっとね
4.まずは準備から〜Objectivity for Javaのインストール〜
4.1.ダウンロードとインストール
4.2.サンプルソースをコンパイルする
4.3.データベースの中身を閲覧する
4.4.クライアントアプリケーションの実行
5.次回予告
ここ数年で、ますますその適用範囲を広げるオブジェクト指向とUML。
J2EEや Webサービスといった新技術を生かすも殺すも、開発者のオブジェクト
指向技術の習熟度次第といっても過言ではないでしょう。
そのような時代のニーズを反映したe-Businessを実現するシステムや、従来
からの基幹業務システムに、古今変わりなく必要とされるのが、システムで
必要となるデータを格納するデータベースです。データベースというと、やは
りまず思い当たるのがOracleやPointBaseのようなRDB(リレーショナル・
データベース)でしょう。「次世代のデータベース」として登場したODB
(オブジェクト・データベース)は、”とっつきにくさ”、”技術者不足”、
”従来のシステムからの移行の難しさ”などにより、なかなか市場で大ブレイク
というわけにはいかないようです。この連載では、まずその”とっつきにくさ”
を解消すべく、ODBの基礎に重点をおいて話を進めたいと思います。
登場人物
Stone(以降:す) | … | 某SI会社の若手、オブジェクト
には興味はあるがODBは初めて(和菓子屋の息子) |
Robert(以降:ろ) | … | ODBの伝道師、特技は謎の関西弁
(和菓子屋に買い物に来た外国人観光客) |
現在Stone君は、和菓子屋を経営している実家から、お客さんからの注文管理シス
テムを作ってくれと頼まれています。オブジェクト指向の勉強をつんだStone君は、
早速分析に取り掛かりましたが…
す「…ふぅ。とりあえずクラス図はこんなもんかな。
言語はJavaを使うからいいとして、次は…っと。データの格納か。やはりここは
RDBだな。テーブル設計でもするか。エンティティ部分はこのクラス達だから…」
今回のサンプルモデルとして、以下のようなモデルを用意しました。
といっても「かんたんUML」で出てくるものを、ほとんどそのまま流用しています
Fig.1 サンプルモデル
す「必要なテーブルはっと、注文、注文明細に商品。
関連は外部キーで持たせればいいか。で、顧客と法人顧客…ん、これらは継承関係
だから別に分ける必要は無いか。でも1つにすると冗長な項目が出て来るんだよなぁ。
そんなこというと注文と注文明細も1つのテーブルでいい気もしてきたぞ。
そういえば、将来的に法人顧客以外の顧客が必要になったらどうするんだ?
法人顧客と共通のテーブルを使おうとするとテーブル定義を変える必要があるぞ。
うーん、どうすればいいんだ・・・」
ちょっと強引な設定ではありますが、RDBにおけるテーブルの設計は、オブジ
ェクト指向設計時のクラスと1対1には対応しないのが現実だと思います。
RDBにおけるテーブルの正規化とパフォーマンスのトレードオフ。そしてオブジ
ェクトモデル内のクラスとテーブルのマッピングは、しばしば悩みの種になるの
ではないでしょうか。
◆◇ 3.1 ODBってここがすごい ◇◆
す「うーん。どうしようかなぁ」
ろ「ここはオブジェクト指向データベースの出番やね」
す「そうかぁ。ODBねぇ…って君は誰?」
ろ「わてロバートいいますねん。ODBの良さを知って
もらおうと、あちこち出歩いてますねん」
す「へぇ。でもODBって、いまいちよくわかんないんだよね。
使っているという話も聞かないし」
ろ「まぁ、たいがいそう言って敬遠されるんですわ。
一度だまされたと思って使ってほしんやけどね。きっと気に入ってくれる思いますけど」
す「ふーん。でもODBを利用するメリットはなんなの?」
ろ「まぁいろいろあるんやけど・・・」
ODBといっても、今回対象とするデータベースであるObjectivity/DB以外にもさま
ざまな製品があります。ここでは、まず一般的にODBについて言われている長所
について紹介します。Objectivity/DBに特化したお話は、また後ほど。
- オブジェクトモデルのテーブルへのマッピングが不要

格納すべきオブジェクトは、状態と関連を維持して二次記憶装置に永続化され
ます。そのため、テーブル設計は不要であり、永続化されたオブジェクトを取得
する際に、再度関連を張りなおす(RDBではJOIN演算に相当)必要はありません。
Fig.2 Objectを永続化する方法
- アプリケーション言語でのデータベース操作が可能

SQLなどのDB操作言語を必要とせず、開発で用いた言語(Objectivity/DBでは、
Java, C++, Smalltalk)でデータベースを操作できます。つまり、
アプリケーション開発者による自然なデータベース操作が可能となります。
- 高速なオブジェクトアクセス

分散されたサーバ上に永続化されたオブジェクトは、クライアントアプリケー
ションから操作される際には、クライアント上のキャッシュ領域
に取得して、ローカルアクセスを行います。
その為、一旦クライアントキャッシュに取得したオブジェクトへのアクセスは非常
に高速です。
Fig.3 Objectへのアクセス
- 柔軟なスキーマの更新

オブジェクト指向による開発では反復型の開発が基本となりますが、繰り返し
のたびにデータベースのスキーマが変化する事は決して珍しくありません。
また、システムを運用している最中にスキーマを更新したいという要求も十分
起こりえます。ODBでは、データベースを新規に作り直す
ことなくスキーマ情報を更新する機能(Objectivity/DBではスキーマ・
エボリューション機能)が提供されています。
す
「自分の場合だと、顧客と法人顧客といった継承関係や、複雑な関連を
テーブルにマッピングしなくていいのは楽だなぁ。
クラスの設計がそのままデータベースの設計になるんだよね?
じゃデータベース設計はもう終わってるじゃん!」
ろ
「まぁ単純にそうというわけでもないんやけど、少なくともテーブルへのマッピング
は不必要ということやね」
す
「SQLが不必要ってどういうこと?単にSQLの構文がJavaライクなものになった
ってこと?」
ろ
「ちゃうちゃう。アプリケーションで操作したオブジェクトの状態が、そのままデータ
ベースに反映されるちゅうことですわ。SQLはデータベースに直接問い合わせてデータ
操作を行う方式ですやろ?そうやなくて、メモリ上のオブジェクトへのアクセスが、そ
のままデータベースに反映されるちゅうことですわ。どうやって反映させんねんって話や
けど、そこはODBを提供するベンダーによってまちまちやね。
ま、いずれにせよユーザにはその辺のことを出来るだけ意識させないような仕組みが提供
されてるから、難しく考える必要はあらへんね。その辺もおいおい実装時にでも説明しま
ひょ。」
◆◇ 3.2 ODBってここがちょっとね ◇◆
す
「なるほどね。でもいい事ばっかりだったらもっと世に普及しているはず
だよね?やっぱりRDBが主流になっているという事は、ODBにも欠点がある
ってこと?」
ろ「ワタシ、ニホンゴワカリマセーン」
現在のRDBの広まりに裏付けされるように、世間でODBがなかなか認知されていないの
が現状です。その原因として、例えば以下のようなODBの弱点が挙げられます。
- アプリケーション依存性が高い

RDBがデータの格納に、アプリケーションとは分離されたテーブル(表)という
概念を用いているのに対して、ODBではアプリケーションで利用するクラスを、
そのままデータベースのスキーマとして利用します。その為、格納されたオブジェクト
を利用するアプリケーションでは、データのスキーマ(クラス)を予め知っておく
必要があります。
- パフォーマンスの不透明さ

格納されているオブジェクトを直接操作するわけですから、そのアクセスの仕方
によってパフォーマンスは大きく変化します(例えば、一度に多くのオブジェクト
を操作するのか、少ないオブジェクトのメソッドを何度も呼び出すのか、等)。
とはいえ、裏を返せばアプリケーションの作り方次第で、パフォーマンスの向上を
追求する事が出来るともいえます。
- 開発時の役割分担の不透明さ

アプリケーション言語によるデータベース操作が可能であるがゆえに、開発時に
おいてアプリケーション開発者とDB開発者の境界が不透明で役割分担がしにくい。
- ”オブジェクト指向”データベースである

メリットであるがデメリットともなりえるのがこの”オブジェクト指向”という
言葉でしょう。実際ODBを利用できる言語はjavaやC++といったオブジェクト指向
言語です。
ODBを有効に利用するためには言語とオブジェクト指向の概念を理解する必要が
ありますが、オブジェクト指向の広まりと共に、この問題は次第に解決されていく事で
しょう。
す「うーん。せっかくだからODBを使ってみるか!でも
ODBっていってもいろいろあるんだよね?買うお金も無いしどうしようか。」
ろ「こちらではObjectivity/DBちゅー製品を紹介させて
もろてます。評価版はただで試用できるので、それを使ってみたらよろし。
こちらのURLからダウンロード
できまっせ。
https://www.ogis-ri.co.jp/otc/products/objectivity/download/index.html」
す「よーし、いっちょやってみまひょか!」
筆者の都合・・・いえ、ひょんな事からODBの採用を決定したStone君。果たして彼の決断は
吉と出るのか、凶と出るのか?はたまた無難に「ユーザの設計、実装次第」とい
うお約束の言葉で締めくくられるのか?
◆◇ 4.1 ダウンロードとインストール ◇◆
本章では、Objectivity for Java(Windows)のインストールと動作確認について説明
します。下記の表にObjectivity/DBの動作環境を示しましたので、環境が用意できる方は
実際に評価版をダウンロードして使ってみる事をお勧めします。なお、本連載では、基本的に
Objectivity for Java 6.0 (Windows)を使用して話を進めていきます。
また、「早く自分で実装したい!」という貴殿貴女のために、動作させるサンプルソー
スと実行方法、さらにはデータベースをブラウズする為のツールの使用方法も載せておき
ます。Objectivity/DB独自の実装部分、階層アーキテクチャに関する記述も出てきますが、
詳細は次回説明しますので、その点ご了承ください。
Objectivity for Java 6.0 (Windows)動作環境
OS | Windows98/NT4.0/2000 |
JDK | SUN1.3 |
Objectivity/DB 6.1 (Linux) 動作環境
まずは
https://www.ogis-ri.co.jp/otc/products/objectivity/index.html
から、Objectivity for Java (以降 OFJ)の Windows NT/2000対応評価版をダウ
ンロードしましょう。ユーザ登録をすませれば、後は無償で試用/評価すること
が可能です。なお、この評価版にはマニュアルの類が一切含まれていないため、
ダウンロード用ページから各種マニュアルもしっかりゲットしておきましょう。
ダウンロード後は、インストールウィザードの指示に従ってインストール作業
をすすめます。ここでは、インストールするディレクトリを、
C:\objy_trial
としました。
また、インストールするコンポーネントについては、最低限
- Objectivity/DB
- Objectivity for Java
の2つを選択するようにします。なお、Apache Web Serverは ooAssistantとい
うGUIのデータベース閲覧/操作ツールを動かすために必要になりますが、OFJを
動作させるのに必須のものではありませんので今回はインストールの対象外と
します。インストールが終了したら、一度マシンをリブートしてください。
さて、ここまで終了したら、無事インストールが終了したかどうかチェックし
てみましょう。「スタート」→「アクセサリ」→「コマンド プロンプト」を起
動して、oocheckls と入力してください。このとき以下のように表示さ
れていれば OKです。
C:\>oocheckls
Objectivity/DB (TM) Check Lock Server Utility, Version R603 Dec 2000
Copyright (c) Objectivity, Inc 1994, 2000. All rights reserved.
The Lock Server is running on '****'.
Server version: R603 Dec 2000
Program "ools-13" run by user "SYSTEM" as process ***.
|
この oochecklsツールは、複数のクライアントがデータベースアクセスを行う
際の排他制御を主に司る、ロックサーバプロセスが起動しているかどうかをチ
ェックするものです。Windows NT/2000の場合、ロックサーバプロセスはOS起動
時にデフォルトで立ち上がるようになっています。
もし、ローカルホスト上でこのプロセスが起動していない場合、oochecklsは以
下のような出力を行います。
C:\>oocheckls
Objectivity/DB (TM) Check Lock Server Utility, Version R603 Dec 2000
Copyright (c) Objectivity, Inc 1994, 2000. All rights reserved.
The Lock Server is not running on 'ONIX'.
|
この場合は、oolockserver と入力して、ロックサーバを手動で起動するよう
にしてください。
C:\>oolockserver
Objectivity/DB (TM) Lock Server Utility, Version R603 Dec 2000
Copyright (c) Objectivity, Inc 1989, 2000. All rights reserved.
Lock Server has been started.
|
◆◇ 4.2 サンプルソースをコンパイルする ◇◆
さて、ここからいよいよ、サンプルソースのコンパイルを行っていきたいと思
います。まずは作業スペースを確保することにしましょう。ここでは以下のデ
ィレクトリを新たに作成することにします。
C:\work\sample1
次に、サンプルコードを用意します。作業ディ
レクトリの下に PersistentPerson.java と Example1.javaの2つの Javaソー
スファイルを作ってください。
// --- PersistentPerson.java ----
import com.objy.db.app.ooObj;
public class PersistentPerson extends ooObj
{
private int id;
private String name;
public PersistentPerson(int id, String name) {
this.id = id;
this.name = name;
}
}
|
// --- Example1.java ---
import com.objy.db.app.oo;
import com.objy.db.app.Connection;
import com.objy.db.app.Session;
import com.objy.db.app.ooFDObj;
import com.objy.db.DatabaseNotFoundException;
import com.objy.db.DatabaseOpenException;
import com.objy.db.ObjectNameNotUniqueException;
public class Example1
{
public static void main(String args[]) {
Connection connection;
try {
connection = Connection.open("TEST", oo.openReadWrite);
} catch (DatabaseNotFoundException e1) {
System.out.println("Federated database not found.");
return;
} catch (DatabaseOpenException e2) {
System.out.println("Federated database already opened.");
return;
}
Session session = new Session();
ooFDObj fd = session.getFD();
session.begin();
PersistentPerson person = new PersistentPerson(0, "Robert Cheong");
try {
fd.bind(person, "Robert");
} catch(ObjectNameNotUniqueException e) {
session.abort();
return;
}
session.commit();
}
}
|
それでは、コンパイル作業に移りましょう。当然ですが、JDKが別途必要になる
ので、まだインストールされていない方は https://java.sun.com/ などから急
いで入手/インストールしてください。ここでは、Java2 SDK Standard Edition
1.3.0 を使用しています。
作業ディレクトリに移動して、以下のようなコマンドを入力、実行します。コンパ
イル後の作業ディレクトリに、PersistentPerson.class と Example1.class が
きちんとできているかどうか確認してください。
C:\>cd work\sample1
C:\work\sample1>javac *.java
|
ここで「シンボルを解釈処理できません。」というエラーが怒濤のごとく表示
される場合、クラスパスの設定が間違っている可能性があります。その場合は、
次のようにクラスパスを明示的に指定してコンパイルを行ってください。
C:\work\sample1>javac -classpath ".;C:\objy_trial\lib\oojava.jar" *.java
|
◆◇ 4.3 データベースの中身を閲覧する ◇◆
さて、これでデータベースにアクセスするクライアントアプリケーションは完
成です。早速実行してみたい気もしますが、実はもう一つだけやる事が残って
います。え? もう実行してしまった??
C:\work\sample1>java -classpath ".;C:\objy_trial\lib\oojava.jar" Example1
Federated database not found.
|
気の早い方の画面には、このような出力が行われたのではないかと思います。
そう、まだ肝心のデータベースを作成していないので、
connection = Connection.open("TEST", oo.openReadWrite);
のデータベースに接続するときに DatabaseNotFoundExceptionが発生してしま
ったというわけです。
Objectivity/DBでは以下のような4つの論理階層構造で永続オブジェクトを管理
しているのですが、
1. フィデレートデータベース(FD)
2. データベース(DB)
3. コンテナ
4. ベーシックオブジェクト
この内、最上位に位置するフィデレートデータベースは、Javaの API経由で作
成することができないため、専用のツール oonewfdを使って作成することにな
ります。ここでは以下のようにしてツールを実行してください。
C:\work\sample1>oonewfd -fdfilepath TEST.FDB -lockserverhost %COMPUTERNAME% TEST
|
oonewfdツールにはたくさんのオプションがありますが、必ず指定しなければな
らないのは、fdfilepath と lockserverhost の2つです。前者はフィデレート
データベースのファイル名、後者は作成するフィデレートデータベースの排他
制御を行うロックサーバプロセスが起動しているホスト名を指定します。
今回、クライアントアプリケーションを実行するマシンがロックサーバホスト
も兼用しているので上記のように指定していますが、もちろん、
echo %COMPUTERNAME%
で表示されるホスト名を直打ちしてもOKです。そして、最後に指定するのは、
ブートファイルというファイルの名前です。これは、先ほど登場した、
connection = Connection.open("TEST", oo.openReadWrite);
Connection.openの第一引数で指定する文字列と一致させる必要があります。
このブートファイルには、作成されたフィデレートデータベースの各種プロパ
ティが記述されています。ちなみにこれはテキストファイルですので、簡単に
中身を見ることが可能です。ただし、このファイルの内容を
テキストエディタなどで直接編集しないようにしてください。
なお、フィデレートデータベースの中身を閲覧するために、oobrowseというツ
ールが提供されています。コマンドラインから以下のように打ち込んでください。
C:\work\sample1>oobrowse TEST
|
このツールでは、フィデレートデータベース以下、格納されているデータベー
ス、コンテナ、ベーシックオブジェクトをGUIで確認することができます。今は
まだ、フィデレートデータベースのみを作成した状態ですので、ウィンドウの
上半分には何も表示されていないと思います(Fig.4 参照)。
これを確認したらウィンドウを閉じてください。
Fig.4 oobrowseの起動
◆◇ 4.4 クライアントアプリケーションの実行 ◇◆
さあ、今度こそ準備が整いました。今、作業ディレクトリには以下のファイル
が揃っていると思います。
TEST
TEST.FDB
Example1.class
PersistentPerson.class
Example1.java
PersistentPerson.java
ここで、先ほどと同じく
C:\work\sample1>java -classpath ".;C:\objy_trial\lib\oojava.jar" Example1
|
と実行してみましょう。
SM: adding new class to schema named PersistentPerson as PersistentPerson
|
と表示されて、プロンプトが返ってくると思います。大した反応がなくて残念
に思っている方もいるかもしれませんが、Example1.javaに書かれた処理はきち
んと実行されています。え、信用できない?
それでは、再び oobrowseツールを実行してフィデレートデータベースの中身を
のぞいてみてください。先ほどとは違って、データベース、コンテナ、そして
PersistentPersonオブジェクトが一つ格納されているのが確認できると思いま
す(Fig.5 参照)。ちなみに、このサンプルではオブジェクトの永続化に bindメソッドを使用
しているので、PersistentPersonオブジェクト以外にも、ooMap, ooMapElemと
いう管理用のオブジェクトも作成されていると思います。
また、コマンドラインから dir を実行してみると分かりますが、作業ディレク
トリに OoFDRoots.TEST.DB という名前の新たなデータベースファイルが
出来ているのが確認できると思います。
Fig.5 oobrowseによるオブジェクトの確認
連載の1回目はこの辺で。次回の連載では、さらにObjectivity/DBに特化した内容へ
踏み込んでいくつもりです。
乞うご期待!