db4o その15(コールバック その2)
先日言及した「コミット時のコールバック」に関して注意すべきことが見つかったので言及しておく。
以前にも書いたが、db4oのデータベースをオープンするモードはその処理形態によって以下のように大別される。
- 組込みモード
- ネットワークモード
実はこれらオープンモードによってセッション間で使用されるトランザクションの実装(具体的にはクラス)が、全く違うものとなっているのだ。
db4oのオープン時に生成されるトランザクションだが、オープンモードによってそれぞれ
と分かれている。
コミット時コールバックはトランザクションのコンテキストから呼ばれるコールバックである。つまりトランザクションの実装が違うと発生するコールバックイベントも違うのである。
Db4o.openFile("roster.db")
サンプルのように組込みモードでローカルファイルを指定してオープンした場合、ローカルトランザクションがシステム全体で一つだけ生成される。トランザクションのコミット時にはcommitting、committed両方のイベントコールバックが発生する。これは問題無いだろう。
ObjectServer os = Db4o.openServer("roster.db", 0); 又は ObjectServer os = Db4o.openServer("roster.db", 0xdb40);
ネットワークモードでデータベースへの接続を共有している場合、生成されるトランザクションはそれぞれの接続が取得するObectContainerインタフェース毎に生成される。そして、このトランザクションからはcommittedイベントコールバックは発生するが、committingイベントコールバックは発生しないのだ。
コミット時コールバックはまだ試用段階の機能だが、データベースをどのようにオープンしているかによって発生するコールバックが違うことに注意が必要である。ただ、これは仕様というよりは不具合のような気がするので早晩実装が変わる可能性が高いと思う。