MapDB 是一个开源的嵌入式数据库引擎,专为 Java 设计。它提供了高性能的键值存储功能,支持持久化和内存映射。
MapDB 简介
MapDB 提供了类似 Java Map 的接口,但具有以下特性:
- 持久化存储
- 高性能
- 嵌入式数据库
- 支持事务
- 内存映射文件
Maven 依赖
xml
<dependency>
<groupId>org.mapdb</groupId>
<artifactId>mapdb</artifactId>
<version>3.0.9</version>
</dependency>
基本使用示例
创建和使用持久化数据库
java
import org.mapdb.DB;
import org.mapdb.DBMaker;
import org.mapdb.HTreeMap;
import java.io.File;
import java.util.Map;
public class MapDBExample {
public static void main(String[] args) {
// 创建数据库
DB db = DBMaker.fileDB("mydb.db")
.transactionEnable() // 启用事务
.make();
// 创建映射表
Map<String, String> map = db.hashMap("mymap")
.keySerializer(org.mapdb.Serializer.STRING)
.valueSerializer(org.mapdb.Serializer.STRING)
.createOrOpen();
// 插入数据
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
// 读取数据
System.out.println("key1: " + map.get("key1"));
System.out.println("key2: " + map.get("key2"));
// 关闭数据库
db.close();
}
}
内存映射数据库
java
import org.mapdb.DB;
import org.mapdb.DBMaker;
import org.mapdb.HTreeMap;
import java.io.File;
import java.util.Map;
public class MapDBExample {
public static void main(String[] args) {
// 创建数据库
DB db = DBMaker.fileDB("mydb.db")
.transactionEnable() // 启用事务
.make();
// 创建映射表
Map<String, String> map = db.hashMap("mymap")
.keySerializer(org.mapdb.Serializer.STRING)
.valueSerializer(org.mapdb.Serializer.STRING)
.createOrOpen();
// 插入数据
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
// 读取数据
System.out.println("key1: " + map.get("key1"));
System.out.println("key2: " + map.get("key2"));
// 关闭数据库
db.close();
}
}
使用事务
java
import org.mapdb.DB;
import org.mapdb.DBMaker;
import org.mapdb.Serializer;
public class TransactionExample {
public static void main(String[] args) {
DB db = DBMaker.fileDB("transaction.db")
.transactionEnable()
.make();
org.mapdb.HTreeMap<String, Integer> map = db.hashMap("mymap")
.keySerializer(Serializer.STRING)
.valueSerializer(Serializer.INTEGER)
.createOrOpen();
// 开始事务
db.commit();
try {
// 执行操作
map.put("transaction_key", 123);
map.put("another_key", 456);
// 提交事务
db.commit();
System.out.println("Transaction committed");
} catch (Exception e) {
// 回滚事务
db.rollback();
System.out.println("Transaction rolled back");
}
db.close();
}
}
存储复杂对象
java
import org.mapdb.DB;
import org.mapdb.DBMaker;
import org.mapdb.Serializer;
import java.io.Serializable;
// 自定义可序列化类
class Person implements Serializable {
private static final long serialVersionUID = 1L;
public String name;
public int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
public class ComplexObjectExample {
public static void main(String[] args) {
DB db = DBMaker.fileDB("objects.db")
.transactionEnable()
.make();
org.mapdb.HTreeMap<Integer, Person> personMap = db.hashMap("persons")
.keySerializer(Serializer.INTEGER)
.valueSerializer(Serializer.JAVA)
.createOrOpen();
// 存储对象
personMap.put(1, new Person("Alice", 30));
personMap.put(2, new Person("Bob", 25));
personMap.put(3, new Person("Charlie", 35));
// 读取对象
Person person = personMap.get(1);
System.out.println("Person: " + person);
// 遍历所有对象
for (java.util.Map.Entry<Integer, Person> entry : personMap.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
db.close();
}
}
BTreeMap 示例
java
import org.mapdb.DB;
import org.mapdb.DBMaker;
import org.mapdb.Serializer;
public class BTreeExample {
public static void main(String[] args) {
DB db = DBMaker.fileDB("btree.db")
.transactionEnable()
.make();
// 创建BTree映射(自动排序)
org.mapdb.BTreeMap<String, Integer> sortedMap = db.treeMap("sortedmap")
.keySerializer(Serializer.STRING)
.valueSerializer(Serializer.INTEGER)
.createOrOpen();
// 插入数据(会自动排序)
String[] keys = {"zebra", "apple", "banana", "cherry", "date"};
for (int i = 0; i < keys.length; i++) {
sortedMap.put(keys[i], i);
}
// 遍历(按排序顺序)
for (java.util.Map.Entry<String, Integer> entry : sortedMap.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
// 范围查询
System.out.println("\nRange query (apple to cherry):");
for (java.util.Map.Entry<String, Integer> entry :
sortedMap.subMap("apple", "cherry").entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
db.close();
}
}
集合类型
java
import org.mapdb.DB;
import org.mapdb.DBMaker;
import org.mapdb.Serializer;
public class CollectionExample {
public static void main(String[] args) {
DB db = DBMaker.fileDB("collections.db")
.transactionEnable()
.make();
// 创建集合
org.mapdb.HTreeSet<String> stringSet = db.hashSet("stringset")
.serializer(Serializer.STRING)
.createOrOpen();
// 添加元素
stringSet.add("item1");
stringSet.add("item2");
stringSet.add("item3");
System.out.println("Set size: " + stringSet.size());
System.out.println("Contains item1: " + stringSet.contains("item1"));
// 遍历集合
for (String item : stringSet) {
System.out.println("Item: " + item);
}
db.close();
}
}
配置选项
java
import org.mapdb.DB;
import org.mapdb.DBMaker;
public class ConfigurationExample {
public static void main(String[] args) {
DB db = DBMaker.fileDB("configured.db")
.fileMmapEnable() // 启用内存映射
.fileMmapPreclearDisable() // 禁用预清除
.closeOnJvmShutdown() // JVM关闭时自动关闭
.encryptionEnable("password") // 启用加密
.make();
// 使用数据库
org.mapdb.HTreeMap<String, String> map = db.hashMap("mymap").createOrOpen();
map.put("config", "test");
System.out.println("Value: " + map.get("config"));
db.close();
}
}
主要特性
- 高性能: 优化的I/O操作
- 持久化: 数据持久存储到磁盘
- 内存映射: 支持大文件的内存映射
- 事务支持: ACID事务
- 并发安全: 线程安全的实现
- 压缩: 支持数据压缩
- 加密: 可选的数据加密
适用场景
- 缓存系统
- 配置存储
- 临时数据存储
- 嵌入式应用
- 需要高性能键值存储的场景
MapDB 是一个功能强大且易于使用的嵌入式数据库解决方案,特别适合需要持久化键值存储的Java应用程序。