Java嵌入式数据库:MapDB

    MapDB是一个快速、易用的嵌入式Java数据库引擎,它提供了基于磁盘或者堆外(off-heap允许Java直接操作内存空间, 类似于C的malloc和free)存储的并发的Maps、Sets、Queues。MapDB的前身是JDBM,已经有10多年的历史。MapDB支持ACID事务、MVCC隔离,它的jar包只有200KB,且无其它依赖,非常轻量。MapDB 提供了并发的 TreeMap 和 HashMap ,使用基于磁盘的存储。快速、可伸缩性以及易用。
    MapDB全部使用Java编写,支持100GB以上的数据存储,且性能可以与很多由C语言开发的数据库(谷歌的Leveldb、甲骨文的Berkeley DB)相媲美。它的主要特性如下:
  并发。MapDB 包含记录级别的锁和先进的并发控制引擎,它的性能可以在多核之间线性扩展,支持并发写。
  快速。MapDB的性能可以与原生数据库相媲美,它经过多次的优化以及重写。
  ACID事务。支持ACID事务并实现了不同形式的MVCC,MapDB使用write-ahead-log或者append-only的方式来存储操作日志。
  灵活。MapDB可以运行在内存缓存中,也可以支持TB级别的的数据库。它支持各种配置以满足不同的需求。
  Hackable。很多特性(实例缓存cache、异步写、压缩) 都是一组类, 易于加入新功能和组件。
  SQL Like。MapDB 有非常快的SQL引擎,包含很多从关系型数据库移植过来的特性,比如辅助索引/集合、自增序列ID、 连接、触发器、组合键。
  低磁盘使用率。MapDB的能缩小磁盘的使用量,并且压缩以及序列化过程都非常快速。
  MapDB采用模块化的架构设计,非常容易扩展,每一个模块都可以被关掉,并且每个模块都可以有不同的设计,比如MapDB中有5种不同的缓存以及3种不同的存储模式。
  CodeFutures的CEO Cory解释了MapDB所要解决的问题,“MapDB为Java程序员提供了一种自然的方式来快速存储大对象,它可以精确匹配应用的需求。大部分应用都遇到过内存溢出或者很多的对象被装载到JVM而引起的过度垃圾回收的问题,很多时候这些问题是由于应用中有很多大的集合对象造成的。现在你可以使用MapDB来处理这些大的集合,且连API都不需要改。另外,MapDB可以轻松的实现排序、遍历、事务。”

  另外,结合SSD硬盘,MapDB可以用于某些单节点的大数据场景。当数据集没有大到使用Hadoop处理时,可以考虑使用使用MapDB来编写基于内存的处理程序。

官方网站:http://www.mapdb.org/

源码:https://github.com/jankotek/MapDB

maven  repository:http://mvnrepository.com/artifact/org.mapdb/mapdb

代码测试:

Maps:

package cn.smartslim.mqtt.demo.map;

import java.io.File;
import java.util.concurrent.ConcurrentNavigableMap;

import org.mapdb.DB;
import org.mapdb.DBMaker;

public class MapsTest {
	public static void main(String[] args) {
		//fluet式    无则创建,有则打开,需密码校验
		DB db = DBMaker.newFileDB(new File("mapdb.db")).closeOnJvmShutdown().encryptionEnable("abc123").make();
		/*
		db.getHashMap(name);
		db.getHashSet(name);
		db.getQueue(name);
		db.getTreeMap(name);
		db.getTreeSet(name);
		db.getStack(name);*/	
		ConcurrentNavigableMap<Integer,String> map = db.getTreeMap("ConcurrentMap");
		map.put(1, "test1");
		map.put(2, "test2");
		//提交持久化	
		db.commit();
		
		map.put(3, "test3");
		// map.keySet() is  [1,2,3]
		System.out.println(map);
		//回滚
		db.rollback(); 
		// map.keySet() is  [1,2]
		System.out.println(map);
		db.close();
	}
}
Sets:

package cn.smartslim.mqtt.demo.set;

import java.io.File;
import java.util.NavigableSet;

import org.mapdb.DB;
import org.mapdb.DBMaker;

public class SetsTest {
	public static void main(String[] args) {
		//异步写入,关闭事务
		DB db = DBMaker.newFileDB(new File("mapdb.db"))
				.closeOnJvmShutdown().transactionDisable()
				.asyncWriteFlushDelay(100).encryptionEnable("abc123").make();
		NavigableSet<Object> set = (NavigableSet<Object>) db.getTreeSet("NavigableSet");
		set.add("aaa");
		set.add("bbb");
		System.out.println(set);
	}
}
Queue:

package cn.smartslim.mqtt.demo.queue;

import java.io.File;
import java.util.concurrent.BlockingQueue;

import org.mapdb.DB;
import org.mapdb.DBMaker;

public class QueuesTest {
	public static void main(String[] args) {
		//异步写入,关闭事务
		DB db = DBMaker.newFileDB(new File("mapdb.db"))
				.closeOnJvmShutdown().transactionDisable()
				.asyncWriteFlushDelay(100).encryptionEnable("abc123").make();
		BlockingQueue<Object> queue = (BlockingQueue<Object>) db.getQueue("queue");
		queue.add("abc");
		queue.add("edf");
		System.out.println(queue);
	}
}

你可能感兴趣的:(mapdb)