MapDBとは、Javaのコレクションをファイルに永続化してくれたり、DBのようなトランザクションを提供してくれるライブラリです。
なかなか面白いです。なぜか日本語の情報はほぼないですが・・・。
(ちょっとずつ情報載せていければと思います)
必要なライブラリ
とにもかくにもMapDB触ってみましょう。
MapDBは、jar(mapdb-X.Y.Z.jar)を一つclasspathに追加するだけで使えます。
ファイルベースの永続化をする
以下のサンプルは、"testdb"というデータベース(実体はファイル)に、"collectionName"という名前を付けたMapにデータを格納する例です。("testdb"がDBのインスタンス名、"collectionName"がテーブル名というイメージで良いと思います)
DB#commit のタイミングでファイルに永続化され、DB#rollbackすると永続化されません。
サンプルコード
import java.io.File;
import java.util.concurrent.ConcurrentNavigableMap;
import org.mapdb.DB;
import org.mapdb.DBMaker;
public class MapDBSample1 {
public static void main(String[] args) {
// まずは格納するためのDBを作る(すでにあれば使いまわす)
DB db = DBMaker.newFileDB(new File("testdb"))
.closeOnJvmShutdown()
.make();
// open existing an collection (or create new)
ConcurrentNavigableMap<Integer, String> map = db.getTreeMap("collectionName");
System.out.println("#0: " + map);
map.put(1, "one");
map.put(2, "two");
// map.keySet() is now [1,2]
db.commit(); //persist changes into disk
System.out.println("#1: " + map);
map.put(3, "three");
System.out.println("#2: " + map);
db.rollback(); // rollback!
System.out.println("#3: " + map); // -> rollback後なのでMapにkey=3のデータが無い
db.close();
}
}
実行結果(初回)
# 0: {}
# 1: {1=one, 2=two}
# 2: {1=one, 2=two, 3=three}
# 3: {1=one, 2=two}
サンプルコードのおおまかな流れ
- DBの生成(または取得)
- まずはDMakerというクラスを利用してデータを格納するためのDBを生成しています。(すでに存在するものであれば、そのDBを使いまわします)
DB db = DBMaker.newFileDB(new File("testdb"))
.closeOnJvmShutdown()
.make();
- 操作するオブジェクトの生成(または取得)
- 操作したいCollectionをDBから取得します。この際にコレクションの名前を指定します。
ConcurrentNavigableMap<Integer, String> map = db.getTreeMap("collectionName");
- データの登録
- 普通のコレクションの操作でデータを格納できます
map.put(1, "one");
- Commit / Rollback
- commitして永続化領域へ格納します。(またはrollbackして永続化しないようにする)
db.rollback();
- DBのclose
- プログラム(アプリケーション)終了時にDBをcloseします
db.close();
サンプルコードを再度実行すると
このプログラムを再度実行すると以下の出力結果が得られます
実行結果(2回目)
# 0: {1=one, 2=two}
# 1: {1=one, 2=two}
# 2: {1=one, 2=two, 3=three}
# 3: {1=one, 2=two}
プログラム開始時点で Mapにデータが格納されているのが分かります。
これは初回に永続化されたデータが復元されているということです。
まとめ
MapDBを使うととても簡単にJavaのCollectionを永続化できました。
MapDBは他にもいろいろ機能を持っているので、少しずつ紹介できたらと思います。