db4o その13(IoAdapter)

前回書いたと思うが、db4oのI/O処理を司る部分はプラガブルになっており挿げ替えることが可能になっている。具体的にはIoAdapterという抽象クラスがI/O処理の対象になっており、ピアとなるサブクラスにより実際のI/Oが実行される仕組みだ。

IoAdapterクラス(サブクラスで実装が必要な抽象メソッドのみ抽出)

public abstract class IoAdapter {
    public abstract void close() throws IOException;
    public abstract void delete(String path);
    public abstract boolean exists(String path);
    public abstract long getLength() throws IOException;
    public abstract IoAdapter open(String path, boolean lockFile, long initialLength) throws IOException;
    public abstract int read(byte bytes, int length) throws IOException;
    public abstract void seek(long pos) throws IOException;
    public abstract void sync() throws IOException;
    public abstract void write(byte buffer, int length) throws IOException;
}

この設計はdb4o自体が利用しており、例えばデフォルトで使われるIoAdapterはランダムファイルアクセスクラスへ操作を委譲したRandomAccessFileAdapterクラスとキャッシュ機能を追加するCachedIoAdapterクラスだ。(※1)

    private final static KeySpec IOADAPTER=new KeySpec(new CachedIoAdapter(new RandomAccessFileAdapter()));

もう一つは全てのI/O処理をメモリ上だけで完結するためのMemoryIoAdapteクラスだ。これを使うとHSQLDBインメモリモードと同じようなことができる。

これらをお手本として様々なI/Oアダプタの実装を用意することができる。例えばdb4oの全てのデータ操作をジャーナルログとして書き出すような処理を書くことを考えているが、そのような用途にはIoAdapterを拡張するのが最も簡単だろう。

※1 開発中の最新版であるver6.2ではバグがあり、backup(バックアップ)に失敗する