MAPDB

Mapdb встраиваемая база данных типа ключ значение.

Опубликовано 10-04-2014
Эксперементы
Теги java, nosql

Mapdb встраиваемая база данных типа ключ значение.

Maven:

<dependency>
    <groupId>org.mapdb</groupId>
    <artifactId>mapdb</artifactId>
    <version>1.0.8</version>
</dependency>

Открытие базы:

DB db = DBMaker.newFileDB(new File("/tmp/tmp.db")).closeOnJvmShutdown().mmapFileEnable().asyncWriteEnable().make()
// или
TxMaker tx = DBMaker.newFileDB(new File("/tmp/tmp.db")).closeOnJvmShutdown().mmapFileEnable().asyncWriteEnable().makeTxMaker();
DB db = tx.makeTx();

Транзакции:

// Глобально
db.commit();
db.rollback();

// Отключение (лучше не использовать)
DBMaker.transactionDisable()

// Одиночные транзакции
TxMaker tx = DBMaker.newFileDB(new File("/tmp/tmp.db")).closeOnJvmShutdown().mmapFileEnable().asyncWriteEnable().makeTxMaker();
DB db = tx.makeTx();
DB db1 = tx.makeTx();

Sequence:

org.mapdb.Atomic.Long al = db.getAtomicLong("name_al");
org.mapdb.Atomic.Boolean ab = db.getAtomicBoolean("name_ab");
org.mapdb.Atomic.Integer ai = db.getAtomicInteger("name_ai");
org.mapdb.Atomic.String as = db.getAtomicString("name_as");
org.mapdb.Atomic.Var<Object> av = db.getAtomicVar("name_av");

Быстрый count:

BTreeMap<Long, String> mm = db.getTreeMap("mm");
org.mapdb.Atomic.Long mm_count = db.getAtomicLong("mm_count");

Bind.size(mm, mm_count);

Вторичный ключ:

BTreeMap<Integer, String[]> map = db.getTreeMap("map");
NavigableSet<Fun.Tuple2<Long, Integer>> sc_map = db.getTreeSet("sc_map");

Bind.secondaryKey((Bind.MapWithModificationListener<Integer, String[]>) map, sc_map, new Fun.Function2<Long, Integer, String[]>() {

    public Long run(Integer key, String[] value) {
       return (long) value.length;
    }

});

map.put(1, new String[] {"1"});
map.put(2, new String[] {"1"});
map.put(3, new String[] {"1","2","3"});

db.commit();

System.out.println("Secondary collection size "+sc_map.size());

Iterator<Integer> it = Fun.filter(sc_map, 1L).iterator();
while (it.hasNext()) {
    int key = it.next();
    System.out.println("key = "+key);
}

Важно:

При изменении уже существующего элемента не примитивного типа в случае использования вторичных ключей перед помещением измененного элемента в коллекцию его следует склонировать в новый объект и поместить новый объект в коллекцию:

String[] old = map.get(1);
String[] neww = new String[old.length];
System.arraycopy(old, 0, neww, 0, old.length);
map.put(1,neww);