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

相关推荐
2301_765703142 小时前
C++中的协程编程
开发语言·c++·算法
m0_748708052 小时前
实时数据压缩库
开发语言·c++·算法
lly2024063 小时前
jQuery Mobile 表格
开发语言
智码未来学堂3 小时前
探秘 C 语言算法之枚举:解锁解题新思路
c语言·数据结构·算法
惊讶的猫3 小时前
探究StringBuilder和StringBuffer的线程安全问题
java·开发语言
jmxwzy3 小时前
Spring全家桶
java·spring·rpc
Halo_tjn3 小时前
基于封装的专项 知识点
java·前端·python·算法
m0_748233173 小时前
30秒掌握C++核心精髓
开发语言·c++
Fleshy数模4 小时前
从数据获取到突破限制:Python爬虫进阶实战全攻略
java·开发语言
Duang007_4 小时前
【LeetCodeHot100 超详细Agent启发版本】字母异位词分组 (Group Anagrams)
开发语言·javascript·人工智能·python