ObjectSquare [2002 年 2 月号]

[技術講座]




今日から始めるオブジェクト指向データベース
〜教えてロバート Step.1〜

株式会社オージス総研
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.次回予告

1.始めに

ここ数年で、ますますその適用範囲を広げるオブジェクト指向とUML。 J2EEや Webサービスといった新技術を生かすも殺すも、開発者のオブジェクト 指向技術の習熟度次第といっても過言ではないでしょう。 そのような時代のニーズを反映したe-Businessを実現するシステムや、従来 からの基幹業務システムに、古今変わりなく必要とされるのが、システムで 必要となるデータを格納するデータベースです。データベースというと、やは りまず思い当たるのがOracleやPointBaseのようなRDB(リレーショナル・ データベース)でしょう。「次世代のデータベース」として登場したODB (オブジェクト・データベース)は、”とっつきにくさ”、”技術者不足”、 ”従来のシステムからの移行の難しさ”などにより、なかなか市場で大ブレイク というわけにはいかないようです。この連載では、まずその”とっつきにくさ” を解消すべく、ODBの基礎に重点をおいて話を進めたいと思います。

登場人物
Stone(以降:す)某SI会社の若手、オブジェクト には興味はあるがODBは初めて(和菓子屋の息子)
Robert(以降:ろ)ODBの伝道師、特技は謎の関西弁 (和菓子屋に買い物に来た外国人観光客)


2.RDBで・・・いいの?

現在Stone君は、和菓子屋を経営している実家から、お客さんからの注文管理シス テムを作ってくれと頼まれています。オブジェクト指向の勉強をつんだStone君は、 早速分析に取り掛かりましたが…

「…ふぅ。とりあえずクラス図はこんなもんかな。 言語はJavaを使うからいいとして、次は…っと。データの格納か。やはりここは RDBだな。テーブル設計でもするか。エンティティ部分はこのクラス達だから…」


今回のサンプルモデルとして、以下のようなモデルを用意しました。 といっても「かんたんUML」で出てくるものを、ほとんどそのまま流用しています

Fig.1 サンプルモデル


「必要なテーブルはっと、注文、注文明細に商品。 関連は外部キーで持たせればいいか。で、顧客と法人顧客…ん、これらは継承関係 だから別に分ける必要は無いか。でも1つにすると冗長な項目が出て来るんだよなぁ。 そんなこというと注文と注文明細も1つのテーブルでいい気もしてきたぞ。 そういえば、将来的に法人顧客以外の顧客が必要になったらどうするんだ? 法人顧客と共通のテーブルを使おうとするとテーブル定義を変える必要があるぞ。 うーん、どうすればいいんだ・・・」


ちょっと強引な設定ではありますが、RDBにおけるテーブルの設計は、オブジ ェクト指向設計時のクラスと1対1には対応しないのが現実だと思います。 RDBにおけるテーブルの正規化とパフォーマンスのトレードオフ。そしてオブジ ェクトモデル内のクラスとテーブルのマッピングは、しばしば悩みの種になるの ではないでしょうか。

3.ODB Pros & Cons

◆◇ 3.1 ODBってここがすごい ◇◆

「うーん。どうしようかなぁ」

「ここはオブジェクト指向データベースの出番やね」

「そうかぁ。ODBねぇ…って君は誰?」

「わてロバートいいますねん。ODBの良さを知って もらおうと、あちこち出歩いてますねん」

「へぇ。でもODBって、いまいちよくわかんないんだよね。 使っているという話も聞かないし」

「まぁ、たいがいそう言って敬遠されるんですわ。 一度だまされたと思って使ってほしんやけどね。きっと気に入ってくれる思いますけど」

「ふーん。でもODBを利用するメリットはなんなの?」

「まぁいろいろあるんやけど・・・」


ODBといっても、今回対象とするデータベースであるObjectivity/DB以外にもさま ざまな製品があります。ここでは、まず一般的にODBについて言われている長所 について紹介します。Objectivity/DBに特化したお話は、また後ほど。


Fig.2 Objectを永続化する方法
「自分の場合だと、顧客と法人顧客といった継承関係や、複雑な関連を テーブルにマッピングしなくていいのは楽だなぁ。 クラスの設計がそのままデータベースの設計になるんだよね? じゃデータベース設計はもう終わってるじゃん!」

「まぁ単純にそうというわけでもないんやけど、少なくともテーブルへのマッピング は不必要ということやね」

「SQLが不必要ってどういうこと?単にSQLの構文がJavaライクなものになった ってこと?」

「ちゃうちゃう。アプリケーションで操作したオブジェクトの状態が、そのままデータ ベースに反映されるちゅうことですわ。SQLはデータベースに直接問い合わせてデータ 操作を行う方式ですやろ?そうやなくて、メモリ上のオブジェクトへのアクセスが、そ のままデータベースに反映されるちゅうことですわ。どうやって反映させんねんって話や けど、そこはODBを提供するベンダーによってまちまちやね。 ま、いずれにせよユーザにはその辺のことを出来るだけ意識させないような仕組みが提供 されてるから、難しく考える必要はあらへんね。その辺もおいおい実装時にでも説明しま ひょ。」

◆◇ 3.2 ODBってここがちょっとね ◇◆

「なるほどね。でもいい事ばっかりだったらもっと世に普及しているはず だよね?やっぱりRDBが主流になっているという事は、ODBにも欠点がある ってこと?」

「ワタシ、ニホンゴワカリマセーン」

現在のRDBの広まりに裏付けされるように、世間でODBがなかなか認知されていないの が現状です。その原因として、例えば以下のようなODBの弱点が挙げられます。

「うーん。せっかくだからODBを使ってみるか!でも ODBっていってもいろいろあるんだよね?買うお金も無いしどうしようか。」

「こちらではObjectivity/DBちゅー製品を紹介させて もろてます。評価版はただで試用できるので、それを使ってみたらよろし。 こちらのURLからダウンロード できまっせ。
http://www.ogis-ri.co.jp/product/b-01-05.html

「よーし、いっちょやってみまひょか!」


筆者の都合・・・いえ、ひょんな事からODBの採用を決定したStone君。果たして彼の決断は 吉と出るのか、凶と出るのか?はたまた無難に「ユーザの設計、実装次第」とい うお約束の言葉で締めくくられるのか?

4.まずは準備から
〜Objectivity for Javaのインストール〜


◆◇ 4.1 ダウンロードとインストール ◇◆


本章では、Objectivity for Java(Windows)のインストールと動作確認について説明 します。下記の表にObjectivity/DBの動作環境を示しましたので、環境が用意できる方は 実際に評価版をダウンロードして使ってみる事をお勧めします。なお、本連載では、基本的に Objectivity for Java 6.0 (Windows)を使用して話を進めていきます。 また、「早く自分で実装したい!」という貴殿貴女のために、動作させるサンプルソー スと実行方法、さらにはデータベースをブラウズする為のツールの使用方法も載せておき ます。Objectivity/DB独自の実装部分、階層アーキテクチャに関する記述も出てきますが、 詳細は次回説明しますので、その点ご了承ください。

Objectivity for Java 6.0 (Windows)動作環境
OSWindows98/NT4.0/2000
JDKSUN1.3

Objectivity/DB 6.1 (Linux) 動作環境
OSRedHat 6.1
JDKSUN1.3


まずは http://www.ogis-ri.co.jp/product/b-01-05.html から、Objectivity for Java (以降 OFJ)の Windows NT/2000対応評価版をダウ ンロードしましょう。ユーザ登録をすませれば、後は無償で試用/評価すること が可能です。なお、この評価版にはマニュアルの類が一切含まれていないため、 ダウンロード用ページから各種マニュアルもしっかりゲットしておきましょう。

ダウンロード後は、インストールウィザードの指示に従ってインストール作業 をすすめます。ここでは、インストールするディレクトリを、

C:\objy_trial

としました。 また、インストールするコンポーネントについては、最低限

の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.javaExample1.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が別途必要になる ので、まだインストールされていない方は http://java.sun.com/ などから急 いで入手/インストールしてください。ここでは、Java2 SDK Standard Edition 1.3.0 を使用しています。
作業ディレクトリに移動して、以下のようなコマンドを入力、実行します。コンパ イル後の作業ディレクトリに、PersistentPerson.classExample1.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によるオブジェクトの確認


5.次回予告


連載の1回目はこの辺で。次回の連載では、さらにObjectivity/DBに特化した内容へ 踏み込んでいくつもりです。
乞うご期待!





記事の内容を5点満点で評価してください。
1点 2点 3点 4点 5点
記事に関するコメントがあれば併せてご記入ください。
  



© 2002 OGIS-RI Co., Ltd.
Index Next
Index Next