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

相关推荐
大模型码小白1 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司2 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地3 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
段一凡-华北理工大学3 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
Ljwuhe3 小时前
C++——多态
开发语言·c++
延凡科技4 小时前
多场景落地复盘:端边云架构无人机智能巡检系统设计与实践
大数据·数据结构·人工智能·科技·架构·无人机·能源
心平气和量大福大4 小时前
C#-WPF-Window主窗体
开发语言·c#·wpf
莫逸风5 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
从零开始的代码生活_5 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
云小逸5 小时前
【C++ 第七阶段:模板、泛型编程与工程综合详解】
开发语言·c++