db4o その20(レプリケーション) 修正
db4o-dRSにおけるレプリケーション処理に関して根本的な誤解をしていたので、書き直す。
誤
- レプリケーションを実行する
dRSによるレプリケーション処理は自動で行われる訳ではなく、現在までに発生している変更差分を取り出してそれを対象に明示的にレプリケート指示を行うことで実行される。
正
- レプリケーションを実行する
dRSによるレプリケーション処理は自動で行われる訳ではなく、レプリケーションセッションで対象となったデータベースの相違を取り出してそれを対象に明示的にレプリケート指示を行うことで実行される。
誤
ObjectSet changed = replication.providerA().objectsChangedSinceLastReplication(); while (changed.hasNext()) { replication.replicate(changed.next()); }
この例ではreplication.providerA()、つまり開かれた"src.db"に対しての変更差分を取得しそれをレプリケーションしている。
正
ObjectSet changed = replication.providerA().objectsChangedSinceLastReplication(); while (changed.hasNext()) { replication.replicate(changed.next()); }この例ではreplication.providerA()つまり開かれた"src.db"を基準にして"dst.db"との相違を取得し、それをレプリケーションしている。
そもそもobjectsChangedSinceLastReplication()メソッドで戻るのはてっきり前回のレプリケーションからの変更差分だと思っていたのが大きな間違い。レプリケーション後に"dst.db"を削除してもう一度レプリケーションを実行した所、objectsChangedSinceLastReplication()メソッドの戻り値であるObjectSetには"src.db"に登録されている全てのオブジェクトが格納されていた。
- 結論
db4o-dRSのレプリケーションはレプリケーション開始時から現在まで発生している差分をベースに実行するのではなく、対象のデータベース双方のオブジェクトのマッチングにより実行されることが判った。この方法はマスタとなる最新のデータベースイメージさえあれば、何時でも何度でも完全な複製を作成できるが、毎回全てのオブジェクトのマッチングを行うため、レプリケーション処理の負荷と時間がオブジェクトの件数と比例する。
必ず全てのオブジェクトをマッチングするのでホットバックアップ、チェックポイント処理に使えそうだ。他のスレッドで優先度下げて実行するなどの工夫が必要か。