db4o その1(オープン/クローズ)

自身の勉強を兼ねて今日からカテゴリに[db4o]を加えていく。また、その時々での疑問をメモして解らないことは次回のネタに繰り越していく形式を取るつもりだ。
ソースコードを調べるとすぐに解ることだが、db4oのクラスライブラリィはJavaと.NETの両プラットホームにおいて同じ実装を提供するように注意深く設計、実装されている。従って、本カテゴリに関してのサンプルコードは基本的にはJavaで書くが.NETもほぼ同じように書けると思って間違いない。

ローカルに配置したdb4oのデータベースをオープン/クローズするのは非常に簡単且つシンプルである。(接続文字列を組み立てる必要があるRDBに慣れると本当に簡単で驚く)

  • データベースをオープンする
ObjectContainer db = Db4o.openFile("stats.db");

これだけである。この後すぐにデータベース上のオブジェクトを操作できる。

ちなみにこの例で言うと、パス上に"stats.db"というファイルが存在しない場合は新規でファイルが生成される。(存在している場合はそのファイルが開かれる)
openFileメソッドが成功して戻るインタフェースはdb4oの全ての操作の基本となるインタフェースであり、以下の操作を持つ。

public interface ObjectContainer {
    public void activate (Object obj, int depth);
    public boolean close ();
    public void commit ();
    public void deactivate (Object obj, int depth);
    public void delete (Object obj);
    public ExtObjectContainer ext();
    public ObjectSet get (Object template);
    public Query query ();
    public ObjectSet query(Class clazz);
    public ObjectSet query(Predicate predicate);
    public ObjectSet query(Predicate predicate,QueryComparator comparator);
    public void rollback();
    public void set (Object obj);
}

見れば大体は解ると思うがDBとしての基本的な操作(open/close/set/get/delete)があり、commit/rollbackもこのインタフェースで行うことができることが解る。普通のDBぽくないメソッドとしてはactivate/deactivateがあるが、これらはOODB特有の問題を軽減するために使用するメソッドである。これらは別の回に書く予定だ。
getやqueryメソッドで提供されるdb4oのクエリ機能だが、そもそもdb4oOODBでありSQLを使わない。(※1) 従って独特のクエリの方式があり非常に面白いので、これまた別な回で書くのでここでは詳しくは述べない。
これ以外で面白いのはextメソッドだ。このメソッドで返されるExtObjectContainerインタフェース、実はObjectContainerを継承した拡張されたインタフェースである。ObjectContainerに比べて更に数々の操作が公開されているがこれは新しい機能や、まだ枯れていない機能の実装を一時的に公開するのが目的である。(プロトタイプ的な機能を拡張インタフェースで公開するというのは面白いアィディアだと思った。今度真似しよう)

※1: db4oSQLを使うためのプロジェクトであるSQL for Objectsが立ち上がっており、ある程度ではあるがSQLを使うこともできる。また、同プロジェクトではJDBCへのポートも同時にサポートしている。

さて、データベースに対して上記のObjectContainerインタフェース又はExtObjectContainerインタフェースによりなんらかの処理を実行した後にはお約束のクローズを必ず行う必要がある。これも簡単だ。

  • データベースをクローズする
db.close();

当然だが、以下のようにオープンとクローズは普通はtry〜finallyブロックに書くのが当たり前になるだろう。

ObjectContainer db = Db4o.openFile("stats.db");
try {
    //データベースに対する処理
} finally {
    db.close();
}

なお、データベースとして開く(作られる)ファイルはO/Sで扱う通常のバイナリファイルなので削除してしまうのも簡単だ。

File dbFile = new File("stats.db");
if ( dbFile.exists() )
    dbFile.delete();

DBを使ったユニットテストではフィクスチャのリセットのためにテストで登録したデータの削除コードを書いたりするが、db4oの場合は単純にテストの最後にデータベースファイルを消してやれば良い訳だ。また、一つのファイルだということはスナップショットやバックアップを取るのも簡単だ。

  • 今日の素朴な疑問

db4oそれ自体はプラットホームフリーだということだが、.NETとJavaの両プラットホームから同一のデータベースにアクセスできるのだろうか。また、その場合はそれぞれのデータに互換性はあるのだろうか。(そのプラットホームにネィティブな型のインスタンスを格納できるのがdb4oの特徴なのだから、それぞれのデータの互換性は無いと思うが)