概述
MapDB是一个功能强大、易于使用的Java嵌入式数据库引擎。它提供了高性能、轻量级和易于扩展的特性,使得开发者可以轻松地构建高效、可靠的数据存储解决方案。
maven依赖
xml
<!-- https://mvnrepository.com/artifact/org.mapdb/mapdb -->
<dependency>
<groupId>org.mapdb</groupId>
<artifactId>mapdb</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>[1.9.22,1.9.999)</version>
</dependency>
示例
- 基础使用
java
@Test
void contextLoads() {
//创建内存数据库
DB db = DBMaker.memoryDB().make();
//创建HashMap数据结构的数据储存对象,类似于mysql的表
HTreeMap<String, String> map = db.hashMap("map")
.keySerializer(Serializer.STRING)
.valueSerializer(Serializer.STRING)
.createOrOpen();
//数据的存取操作,类似于JDK中Map的操作
map.put("name","你好");
System.out.println(map.get("name"));
//创建HashSet数据结构的数据储存对象
HTreeMap.KeySet<String> set = db.hashSet("set")
.serializer(Serializer.STRING)
.createOrOpen();
//数据的存取操作,类似于JDK中Set的操作
set.add("A");
//创建TreeMap数据结构的数据储存对象
BTreeMap<String, String> treeMap = db.treeMap("treeMap")
.keySerializer(Serializer.STRING)
.valueSerializer(Serializer.STRING)
.createOrOpen();
//数据的存取操作
treeMap.put("name","你好");
System.out.println(treeMap.get("name"));
//创建TreeSet数据结构的数据储存对象
NavigableSet<String> treeSet = db.treeSet("treeSet")
.serializer(Serializer.STRING)
.createOrOpen();
//数据的存取操作
treeSet.add("A");
//创建IndexTreeList数据结构的数据储存对象
IndexTreeList<Object> treeList = db.indexTreeList("treeList")
.createOrOpen();
//数据的存取操作
treeList.add("A");
System.out.println(treeList.get(0));
//关闭数据库
db.close();
}
- 持久化存储
java
//创建文件数据库
DB db = DBMaker.fileDB("D:\\develop\\cache.db").make();
- 事务支持
java
@Test
void contextLoads() {
//创建内存数据库
DB db = DBMaker.memoryDB().transactionEnable().make();
//创建HashMap数据结构的数据储存对象,类似于mysql的表
HTreeMap<String, String> map = db.hashMap("map")
.keySerializer(Serializer.STRING)
.valueSerializer(Serializer.STRING)
.createOrOpen();
//数据的存取操作,类似于JDK中Map的操作
map.put("v1","A");
map.put("v2","B");
db.commit();
map.put("v3","C");
map.put("v4","D");
db.rollback();
map.put("v5","E");
map.put("v6","F");
//添加成功数据:[v5, v1, v6, v2],v3、v4未添加已回滚
System.out.println(map.keySet());
//关闭数据库
db.close();
}
常用API
数据库操作对象
- DBMaker 工厂类,用于创建不同类型的数据库实例。
| 方法 | 说明 |
|---|---|
| memoryDB() | 创建内存数据库,数据被序列化后存储在 byte 数组中 默认模式,适用于大多数场景,比堆内模式更节省GC 开销 |
| heapDB() | 创建堆内数据库,数据直接存储在 Java 堆中,不使用序列化,适用于小数据集,缺点是受 GC 影响,数据量大会导致性能下降 |
| memoryDirectDB() | 使用Java NIO的DirectByteBuffer,数据存储在堆外内存 ,不受 GC 控制,适合大数据量场景 ,性能最好,但需要手动管理内存 |
| fileDB(File file) fileDB(String file) | 创建文件数据库,将数据保存到文件中。 |
| tempFileDB() | 创建临时文件数据库,数据在数据库关闭后会自动删除 。 |
| heapShardedHashMap(Int concurrency) | 用于构建分片机制的堆内储存对象(map数据结构),返回HashMapMaker对象 |
| heapShardedHashSet(Int concurrency) | 用于构建分片机制的堆内储存对象(set数据结构),返回HashSetMaker对象 |
| memoryShardedHashMap(Int concurrency) | 用于构建分片机制的内存储存对象(map数据结构),返回HashMapMaker对象 |
| memoryShardedHashSet(Int concurrency) | 用于构建分片机制的内存储存对象(set数据结构),返回HashSetMaker对象 |
| volumeDB(Volume volume,Boolean volumeExists) | 创建基于 Volume 存储的数据库 |
- Maker DB对象创建对象
| 方法 | 说明 |
|---|---|
| allocateIncrement(Long incrementSize) | 每次批量分配自增值时的步长 |
| allocateStartSize(Long size) | 初始化内存池的起始大小 |
| checksumHeaderBypass() | 绕过数据库文件头校验和检查 |
| checksumStoreEnable() | 是否在存储数据时计算并保存校验和(如CRC32、MD5等),用于后续验证数据的完整性。 |
| cleanerHackEnable() | 是否启用直接调用底层清理接口绕过 JVM 限制,加速内存回收。 |
| closeOnJvmShutdown() | 在 JVM 关闭时自动释放数据库资源 |
| closeOnJvmShutdownWeakReference() | 在 JVM 关闭时利用弱引用的特性自动触发清理逻辑,同时减少因强引用导致的内存无法释放问题。 |
| concurrencyDisable() | 禁用 MapDB 内部的并发控制机制(如读写锁、分段锁等),使数据库操作变为单线程执行模式。 |
| concurrencyScale(Int segmentCount) | 控制 MapDB 内部并发结构(如哈希表分段锁、B树节点锁等)的并发访问能力,值越大表示支持更高的并发线程数。 |
| executorEnable() | 启用异步执行引擎 |
| fileChannelEnable() | 启用FileChannel模式,该模式通过Java NIO的FileChannel实现磁盘存储,性能介于普通文件存储和内存映射(Mmap)之间。 |
| fileDeleteAfterClose() | 在数据库关闭时自动删除磁盘文件。 |
| fileDeleteAfterOpen() | 在数据库开启时自动删除磁盘文件。 |
| fileLockDisable() | 禁用文件锁,适用于需要避免文件锁定冲突的场景。 |
| fileLockWait() fileLockWait(Long timeout) | 用于在尝试获取文件锁时设置一个最大等待时间 |
| fileMmapEnable() | |
| fileMmapEnableIfSupported() | |
| fileMmapPreclearDisable() | 禁用内存映射文件在使用前的预清零操作 |
| fileSyncDisable() | 禁用文件同步操作,将不会在每次写入后立即将数据同步到磁盘,提升数据库的写入性能,但有数据丢失风险。 |
| readOnly() | 启用只读模式,数据库实例仅允许读取操作,任何写入、删除或修改操作会抛出 |
| transactionEnable() | 开启数据库事务支持 |
| make() | 创建DB实例对象 |
- DB 数据库对象
| 方法 | 说明 |
|---|---|
| hashMap(String name ) hashMap(String name , keySerializer Serializer, valueSerializer Serializer) | 用于创建hashMap数据结构的储存对象。 |
| hashSet(String name ) hashSet(String name ,Serializer serializer ) | 用于创建hashSet数据结构的储存对象。 |
| treeMap(String name ) treeMap(String name ,GroupSerializer keySerializer,GroupSerializer valueSerializer) | 用于创建treeMap数据结构的储存对象。 |
| treeSet(String name ) treeSet(String name ,GroupSerializer serializer) | 用于创建treeSet数据结构的储存对象。 |
| indexTreeList(String name ) indexTreeList(String name ,Serializer serializer ) | 用于创建indexTreeList数据结构的储存对象。 |
| atomicBoolean(String name) atomicBoolean(String name ,Boolean value ) | 线程安全的布尔类型原子操作 |
| atomicInteger(String name ) atomicInteger(String name ,Int value ) | 线程安全的整数原子操作 |
| atomicLong(String name) atomicLong(String name ,Long value ) | 线程安全的长整数原子操作 |
| atomicString(String name ) atomicString(String name , String value) | 线程安全的字符串原子操作 |
| atomicVar(String name ) atomicVar(String name ,Serializer serializer ) atomicVar(String name ,Serializer serializer ,E value) | 线程安全的序列化对象原子操作 |
| commit() | 数据库提交数据 |
| rollback() | 数据库回滚数据 |
| close() | 关闭数据库 |
| getClassLoader() | 获取类加载器 |
| getDefaultSerializer() | 获取默认序列化器 |
| isThreadSafe() | 判断线程是否安全 |
| getShutdownHook() | 用于获取数据库实例关联的关闭钩子,能够在JVM关闭时自动执行数据库的关闭操作,确保数据完整性和资源正确释放 |
| checkThreadSafe() | 通过内置的同步控制机制来保证多线程环境下的数据一致性 |
| defaultSerializerRegisterClass(Class clazz) | 用于向序列化器注册表注册指定类的默认序列化器 |
| exists(String name) | 用于检查指定名称的资源是否存在 |
| get(String name) | |
| getAll() | |
| getAllNames() | |
| getNameForObject(Any e ) | |
| getStore() | |
| isClosed() | |
| nameCatalogGetClass(SortedMap<String, String> nameCatalog,String key ) | |
| nameCatalogLoad() | |
| nameCatalogParamsFor(String name ) | |
| nameCatalogPutClass(SortedMap<String, String> nameCatalog,String key ,Any obj ) | |
| nameCatalogSave(SortedMap<String, String> nameCatalog) | |
| nameCatalogVerifyGetMessages() |
数据储存结构对象创建对象
- HashMapMaker
| 方法 | 说明 |
|---|---|
| create() | 创建新的集合。 如果集合存在,将扔出异常。 |
| open() | 打开存在的集合。 如果集合不存在,将扔出异常。 |
| createOrOpen() | 如果存在就打开, 否则创建。 |
| counterEnable() | 启用大小计数器,启用后 map.size()是实时的,但是在插入时会有一些开销。 |
| expireAfterCreate() expireAfterCreate(Long ttl) expireAfterCreate(Long ttl,TimeUnit unit ) | 基于创建时间设置过期时间 |
| expireAfterGet() expireAfterGet(Long ttl) expireAfterGet(Long ttl,TimeUnit unit ) | 基于最后访问时间设置过期时间 |
| expireAfterUpdate() expireAfterUpdate(ttl Long) expireAfterUpdate(ttl Long,TimeUnit unit ) | 基于最后更新时间设置过期时间 |
| expireCompactThreshold(Double freeFraction ) | 配置启动压缩的 剩余空间阈值,例如配置0.4则剩余空间不足40%时启动数据压缩 |
| expireExecutor(ScheduledExecutorService executor) | 配置过期处理线程池 |
| expireExecutorPeriod(Long period ) | 设置过期检测时间周期 |
| expireMaxSize(Long maxSize ) | 设置 数据储存集合大小 |
| expireStoreSize(Long storeSize ) | 设置储存数据的大小 |
| expireOverflow(MutableMap<K, V> overflowMap) | 配置数据溢出时的数据保存对象 |
| hashSeed(int hashSeed ) | 指定哈希种子 |
| keySerializer(Serializer keySerializer ) | 设置键 序列化器 |
| valueSerializer(Serializer valueSerializer) | 设置值 序列化器 |
| layout(int concurrency,int dirSize,int levels) | 设置底层数据结构布局。concurrency(线程数)、nodeSize(节点大小)、levels(层级数) |
| modificationListener(MapModificationListener<K, V> listener) | 设置底层数据结构布局。concurrency(线程数)、nodeSize(节点大小)、levels(层级数) |
| removeCollapsesIndexTreeDisable() | |
| valueInline() | |
| valueLoader(Function1 valueLoader) | 设置键为空时的默认值 |
- HashSetMaker
| 方法 | 说明 |
|---|---|
| create() | 创建新的集合。 如果集合存在,将扔出异常。 |
| open() | 打开存在的集合。 如果集合不存在,将扔出异常。 |
| createOrOpen() | 如果存在就打开, 否则创建。 |
| counterEnable() | 启用大小计数器,启用后 map.size()是实时的,但是在插入时会有一些开销。 |
| expireAfterCreate() expireAfterCreate(Long ttl) expireAfterCreate(Long ttl,TimeUnit unit) | 基于创建时间设置过期时间 |
| expireAfterGet() expireAfterGet(Long ttl) expireAfterGet(Long ttl,TimeUnit unit) | 基于最后访问时间设置过期时间 |
| expireCompactThreshold(Double freeFraction) | 配置启动压缩的 剩余空间阈值,例如配置0.4则剩余空间不足40%时启动数据压缩 |
| expireExecutor(ScheduledExecutorService executor) | 配置过期处理线程池 |
| expireExecutorPeriod(Long period) | 设置过期检测时间周期 |
| expireMaxSize(Long maxSize) | 设置 数据储存集合大小 |
| expireStoreSize(Long storeSize) | 设置储存数据的大小 |
| hashSeed(int hashSeed) | 指定哈希种子 |
| layout(int concurrency,int dirSize,int levels) | 设置底层数据结构布局。concurrency(线程数)、nodeSize(节点大小)、levels(层级数) |
| removeCollapsesIndexTreeDisable() | |
| serializer(Serializer serializer) |
- IndexTreeListMaker
| 方法 | 说明 |
|---|---|
| create() | 创建新的集合。 如果集合存在,将扔出异常。 |
| open() | 打开存在的集合。 如果集合不存在,将扔出异常。 |
| createOrOpen() | 如果存在就打开, 否则创建。 |
| layout(int dirSize,int levels) | 设置底层数据结构布局。concurrency(线程数)、nodeSize(节点大小)、levels(层级数) |
| removeCollapsesIndexTreeDisable() |
- IndexTreeLongLongMapMaker
| 方法 | 说明 |
|---|---|
| create() | 创建新的集合。 如果集合存在,将扔出异常。 |
| open() | 打开存在的集合。 如果集合不存在,将扔出异常。 |
| createOrOpen() | 如果存在就打开, 否则创建。 |
| layout(int dirSize,int levels) | 设置底层数据结构布局。concurrency(线程数)、nodeSize(节点大小)、levels(层级数) |
| removeCollapsesIndexTreeDisable() |
- TreeMapMaker
| 方法 | 说明 |
|---|---|
| create() | 创建新的集合。 如果集合存在,将扔出异常。 |
| open() | 打开存在的集合。 如果集合不存在,将扔出异常。 |
| createOrOpen() | 如果存在就打开, 否则创建。 |
| counterEnable() | 启用大小计数器,启用后 map.size()是实时的,但是在插入时会有一些开销。 |
| createFrom(Iterator<kotlin.Pair<K, V>> iterator) | |
| createFromSink() | |
| keySerializer(GroupSerializer keySerializer) | |
| maxNodeSize(int size) | |
| modificationListener(MapModificationListener<K, V> listener) | |
| valueSerializer(GroupSerializer valueSerializer) | |
| valuesOutsideNodesEnable() |
- TreeSetMaker
| 方法 | 说明 |
|---|---|
| create() | 创建新的集合。 如果集合存在,将扔出异常。 |
| open() | 打开存在的集合。 如果集合不存在,将扔出异常。 |
| createOrOpen() | 如果存在就打开, 否则创建。 |
| counterEnable() | 启用大小计数器,启用后 map.size()是实时的,但是在插入时会有一些开销。 |
| maxNodeSize(int size) | 配置最大节点数量 |
| serializer(GroupSerializer serializer) | 数组序列化器 |
线程安全的变量创建对象
| 类 | 说明 |
|---|---|
| AtomicStringMaker | 用于实现线程安全的字符串操作 |
| AtomicLongMaker | 用于实现线程安全的Long类型操作 |
| AtomicIntegerMaker | 用于实现线程安全的Intger类型操作 |
| AtomicBooleanMaker | 用于实现线程安全的布尔类型操作 |
| AtomicVarMaker | 用于实现线程安全的指定类型对象操作 |
Serializer 序列化器
- 可用的序列化实现类(Serializer接口常量)
| 常量 | 说明 |
|---|---|
| CHAR | 字符(Character)序列化 |
| STRING_ORIGHASH | 字符串(String)序列化,使用弱哈希String.hashCode()。通过保留原始哈希值来提高性能。 |
| STRING | 字符串(String)序列化,使用强哈希算法,能够处理各种字符串数据。 |
| STRING_DELTA | 字符串(String)序列化,基于差分编码,仅存储字符串与前一个值的差异部分,适合存储相似字符串 |
| STRING_DELTA2 | 字符串(String)序列化,支持更复杂的差分策略,兼容性更强,适用于更广泛的字符串模式。 |
| STRING_INTERN | 字符串(String)序列化,使用字符串池优化,通过复用相同字符串实例减少内存占用。 |
| STRING_ASCII | 字符串(String)序列化,使用ASCII字符优化,用于处理ASCII编码的字符串数据。 |
| STRING_NOSIZE | 字符串(String)序列化,使用字符串数据优化,不存储字符串长度信息,减少序列化开销,适合固定长度或已知长度的字符串。 |
| LONG | 长整型(Long)序列化,直接存储长整型值,无压缩或增量计算。适用于需要直接访问原始值的简单场景,如唯一ID或计数器。 |
| LONG_PACKED | 长整型(Long)序列化,将多个长整型值打包存储,减少内存占用。适用于存储大量连续长整型数据(如时间戳序列),通过位压缩优化空间效率。 |
| LONG_DELTA | 长整型(Long)序列化,存储长整型值的增量(差值),而非绝对值。数据具有单调递增或可预测变化趋势(如传感器读数),可显著减少存储空间。 |
| INTEGER | 整数(int)序列化, 直接将int类型转换为4字节的二进制流存储。适用于数据分布均匀或无规律时的通用场景。 |
| INTEGER_PACKED | 整数(int)序列化, 通过变长编码(类似UTF-8)压缩整数,小数值占用更少字节(1-5字节),大数值占用5字节。适用于数据中包含大量小整数时(如ID、状态码)。 |
| INTEGER_DELTA | 整数(int)序列化, 存储整数与前一个值的差值(Δ),适用于有序或连续递增的数据(如时间戳)。 |
| BOOLEAN | 布尔类型(boolean)序列化 |
| RECID | 长整型(Long)序列化,用于唯一标识单条存储记录 |
| RECID_ARRAY | 长整型数组(Long[])序列化,用于管理多个RECID的数组类型,适用于批量存储或关联记录的场景。 |
| ILLEGAL_ACCESS | 对象(Object)序列化, 序列化与反序列化直接抛异常,用于权限控制。 |
| BYTE_ARRAY | 字节数组(byte[])序列化,标准字节数组存储,基准性能,无特殊优化,适用于通用二进制数据 |
| BYTE_ARRAY_DELTA | 字节数组(byte[])序列化,使用增量编码(差分存储),适用于重复内容较多的二进制数据(如日志) |
| BYTE_ARRAY_DELTA2 | 字节数组(byte[])序列化,优化版增量编码(支持快速查找),适用于高频更新的二进制数据(如实时监控) |
| BYTE_ARRAY_NOSIZE | 字节数组(byte[])序列化,无长度前缀(通过流确定大小),适用于大文件存储(如视频、PDF) |
| CHAR_ARRAY | 字符数组(char[])序列化 |
| INT_ARRAY | 整数数组(int[])序列化 |
| LONG_ARRAY | 长整型数组(long[])序列化 |
| DOUBLE_ARRAY | 双精度浮点数数组(double[])序列化 |
| JAVA | 对象(Object)序列化,基于Java(ObjectOutputStream 和 ObjectInputStream)原生序列化机制实现,支持所有实现了 Serializable 接口的对象 |
| ELSA | 高效字符串序列化,适用于高频字符串存储(如日志、消息队列)、多语言文本处理(支持完整 Unicode)、需要快速随机访问的场景(通过索引直接定位) |
| UUID | 随机字符串(UUID)序列化 |
| BYTE | 字节(byte)序列化 |
| FLOAT | 浮点数(float)序列化 |
| DOUBLE | 双精度浮点数(double)序列化 |
| SHORT | 短整型(short)序列化 |
| SHORT_ARRAY | 短整型数组(short[])序列化 |
| FLOAT_ARRAY | 浮点数数组(float[])序列化 |
| BIG_INTEGER | 大整数(BigInteger)序列化 |
| BIG_DECIMAL | 大数(BigDecimal)序列化 |
| CLASS | 类(Class) 序列化 |
| DATE | 日期(Date) 序列化 |