Javaで開発を行う際に、個人規模なので軽量なあれこれが欲しくなるのですが、基本的にJavaでライブラリを探すと重量級のものが多くあります。 ORMなどはその最たる例だと思います。 けれどいわばMicro-ORM的なものや、そのような永続化を主眼に置いたライブラリは、どのような規模でも欲しくなるものだと思います。 個人で開発を行うにあたって、改めて軽量級でオブジェクトの永続化を主眼に置いたライブラリを探してみましたので、いくつか紹介したいと思います。
なお、今回探した際の観点としては、
- Stream APIと親和性が高い(Collection APIでも可)
- 設定レスで利用できる
- 永続化対象のオブジェクトを、ファイルシステム上に保持できる
- Key-Value-Store(規模的にSQLは書きたくない)
というものです。 特に重要視したのは、Stream APIとの親和性および設定レスでの利用という点です。
Chronicle Map
特徴として、
- 高パフォーマンス
- off-heapな領域に保持(Direct ByteBuffers)またはファイルシステム上に永続化可能
- java.util.MapのAPIで使える
- TCP/UDP越しにレプリケート可能
という感じの、かなりリッチなライブラリ。 あまり軽量っていう感じではないけれど、ある程度本格的なものが欲しかったら考慮する価値がありそう。
OrientDB
OrientDBの特徴は、
- Document DB系
- Scalable
- トランザクションサポート
- 複数サーバ上でレプリケート可能
- RDBからデータを取り込める
- SQLでのクエリ操作に対応
と、これまたリッチなライブラリ。 なんか軽量って言いたくないレベル…。
MapDB
今回紹介する中で一番有力だと思っているのがこのMapDBです。
- Collection APIに永続化の機能を付与
- off-heapな領域に保持(Direct ByteBuffers)またはファイルシステム上に永続化可能
という感じ。 今回求めていた通りの軽量さ加減なので、MapDBについてもうちょい説明します。
https://jankotek.gitbooks.io/mapdb/content/quick-start/
<dependency>
<groupId>org.mapdb</groupId>
<artifactId>mapdb</artifactId>
<version>VERSION</version>
</dependency>
インストールはmavenで一発。 これは最近のライブラリならほとんどそうですね。 Antの時代などを考えると本当に楽になりました。
//import org.mapdb.*
DB db = DBMaker.memoryDB().make();
ConcurrentMap map = db.hashMap("map").createOrOpen();
map.put("something", "here");
このような感じで、メソッドチェーン形式で設定を行い、永続化機能つきのConcurrentMapをインスタンシエートするらしい。 この形式で利用できるなら、既存のソースコードに組み込むだけで簡単に永続化できる気がします。 こちらだとoff-heapに領域を確保するっぽいですね。 off-heapの場合に永続化がされるかは未検証ですが、少なくともon-heapよりは高速化が期待できそうだし、ファイルストアとAPIが共通なのは嬉しい。
DB db = DBMaker.fileDB("file.db").make();
ConcurrentMap map = db.hashMap("map").createOrOpen();
map.put("something", "here");
db.close();
こちらはファイルに永続化する例。 インスタンシエートするまではoff-heapと差異はあるけど、これは仕方ないですね。 その後はAPIが共通なので、開発時にはoff-heapで、本番ではファイルで、とか使い分けができそう。
現段階で予想される難点として、DI層とどう組み合わせるかってことですね。 いくらでもやり方はあるけれど、単にデフォルトコンストラクタをAOPで注入すると設定が入らないので、そこをどうするかは考えないといけない。 まぁ永続化対象のクラスごとに型を作るなど、対策はありますのでそう大きな問題ではないです。
まとめ
今回、Javaで使える軽量級のKVS的に使えるライブラリを3つ紹介しました。 Chronicle DBとOrientDBはある程度しっかりと使いたい用途で、MapDBはカジュアルに利用する用途で使い勝手が良さそうかなと思います。
さて、MapDBを実際に使ってみるか…。