mapdb

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应用程序。

相关推荐
MXM_7779 小时前
laravel 并发控制写法-涉及资金
java·数据库·oracle
prettyxian9 小时前
【QT】信号与槽基础:手动连接的原理与实践
开发语言·qt
傻乐u兔9 小时前
C语言初阶————结构体
c语言·开发语言
weixin_445054729 小时前
力扣热题52
开发语言·python
逑之9 小时前
C语言笔记2:C语言数据类型和变量
c语言·开发语言·笔记
这就是佬们吗9 小时前
告别 Node.js 版本冲突:NVM 安装与使用全攻略
java·linux·前端·windows·node.js·mac·web
何中应9 小时前
@Autowrited和@Resource注解的区别及使用场景
java·开发语言·spring boot·后端·spring
源代码•宸9 小时前
Golang语法进阶(Context)
开发语言·后端·算法·golang·context·withvalue·withcancel
一条咸鱼_SaltyFish9 小时前
[Day16] Bug 排查记录:若依框架二次开发中的经验与教训 contract-security-ruoyi
java·开发语言·经验分享·微服务·架构·bug·开源软件