Skip to main content
 首页 » 编程设计

java之mapDB的基本用法

2022年07月18日30luoye11

第一步加依赖:

<dependency>
<groupId>org.mapdb</groupId>
<artifactId>mapdb</artifactId>
<version>3.0.7</version>
</dependency>

第二步:
package com.rongyi.platform.game.web.websocket; 
 
import org.mapdb.DB; 
import org.mapdb.DBMaker; 
import org.mapdb.HTreeMap; 
import org.mapdb.Serializer; 
 
import java.util.concurrent.ConcurrentMap; 
import java.util.concurrent.Executors; 
import java.util.concurrent.TimeUnit; 
 
 
public class MapDB { 
 
    /** 
    * @desc   : mapDB的基本用法, 一般不这样用,因为可以直接用jvm的堆内存(如hashMap,ConcurrentMap等)。 
    * @author : 毛会懂 
    * @create: 2021/11/18 11:01:00 
    **/ 
    public static void main(String[] args) { 
        DB db = DBMaker.memoryDB().make(); // 基于堆内存, 进程结束后,数据消失。 
        ConcurrentMap map = db.hashMap("map").create(); // 创建map名称为map的结构。 
        map.put("key","value"); 
        System.out.println("获取值:" + map.get("key")); 
        db.close(); 
    } 
 
    /**  mapDB写数据到磁盘 
    * @desc   : 描述 
    * @author : 毛会懂 
    * @create: 2021/11/18 11:00:00 
    **/ 
    public static void main2(String[] args) { 
        DB db = DBMaker.fileDB("file1.db")  // 基于磁盘存储,进程结束后,数据不丢失。 
                .checksumHeaderBypass() // 文件损坏(比如没有db.close()有可能造成文件损坏), 则修复。 
                .allocateStartSize(10*1024*1024) // 初始化文件的大小,为10M 
                .allocateIncrement(1024*1024).make(); // 文件递增的大小为1M 
        // 在db中创建或打开name为map的map结构。name的名字是自己定义的。 
        ConcurrentMap<String,String> map = db.hashMap("map", Serializer.STRING,Serializer.STRING).createOrOpen(); 
        for(Long i = 0L;i < Integer.MAX_VALUE;i++){ 
            map.put(i.toString(),"大家好" + i); 
            System.out.println(i); 
        } 
        db.close();  // 好习惯是进程结束的时候一定要db.close() 
    } 
 
    /** 
    * @desc   : mapDB直接从磁盘中读数据 
    * @author : 毛会懂 
    * @create: 2021/11/18 11:00:00 
    **/ 
    public static void main3(String[] args) { 
        DB db = DBMaker.fileDB("file1.db") 
                .checksumHeaderBypass() 
                .allocateStartSize(10*1024*1024) 
                .allocateIncrement(1024*1024).make(); 
        ConcurrentMap<String,String> map = db.hashMap("map", Serializer.STRING,Serializer.STRING).createOrOpen(); 
        System.out.println(map.get("1350354"));  // 从main2写入的数据,可以从这个进程中读取出来。因为是写到磁盘的。 
        db.close(); 
    } 
 
   /** mapDB 基于磁盘的  hashMap和hashSet的用法 
   * @desc   : 描述 
   * @author : 毛会懂 
   * @create: 2021/11/18 10:59:00 
   **/ 
    public static void main4(String[] args) { 
        DB db = DBMaker.fileDB("file3.db").make(); 
        ConcurrentMap<String, Long> map = db.hashMap("map1", Serializer.STRING, Serializer.LONG).create(); 
        HTreeMap.KeySet<String> set = db.hashSet("set1", Serializer.STRING).create(); 
        map.put("something",123L); 
        set.add("123"); 
        set.add("456"); 
        System.out.println(map.get("something")); 
        System.out.println(set.getMap().keySet()); 
    } 
 
    /**  mapDB的事务操作 
    * @desc   : 描述 
    * @author : 毛会懂 
    * @create: 2021/11/18 10:59:00 
    **/ 
    public static void main5(String[] args) { 
        DB db = DBMaker.fileDB("file4.db") 
                .fileMmapEnable()  //  打开文件与内存的映射,适用于64的机器,32的机器有可能有问题 
                .transactionEnable()  // dbMap支持事务。 
                .closeOnJvmShutdown() 
                .make(); 
        HTreeMap<String, Long> map = db.hashMap("mapsl3", Serializer.STRING, Serializer.LONG).createOrOpen(); 
        map.put("a",1L); 
        map.put("b",2L); 
        db.commit(); // 提交事务 
        System.out.println(map.get("a")); 
        System.out.println(map.get("b")); 
        map.put("c",3L); 
        System.out.println(map.get("c")); 
        db.rollback();  // 回滚事务 
        System.out.println(map.get("c")); // 回滚后数据不再存在 
        System.out.println(map.get("a")); 
        db.close(); 
    } 
 
    /**  mapDB,支持内存和磁盘同步数据 
     * 注意: 在内存的数据get后,如果到了过期时间,不是立即同步到磁盘的,具体同步到磁盘的时间不确定 
     *         所以有时候直接从磁盘读是读不到数据的。 
     *         正确的用法是:每次都要从内存读。 
    * @desc   : 描述 
    * @author : 毛会懂 
    * @create: 2021/11/18 10:54:00 
    **/ 
    public static void main6(String[] args) throws InterruptedException { 
        DB dbDisk = DBMaker.fileDB("file48").checksumHeaderBypass().make(); 
        DB dbMemory = DBMaker.memoryDB().checksumHeaderBypass().make(); 
 
        HTreeMap onDisk = dbDisk.hashMap("onDisk").createOrOpen(); 
        HTreeMap inMemory = dbMemory.hashMap("inMemory") 
                .expireAfterGet(1, TimeUnit.SECONDS)  // get后,多久失效 
                .expireOverflow(onDisk) // 失效后同步到磁盘,但同步的时间不确定 
                .expireExecutor(Executors.newScheduledThreadPool(2)) // 没太懂这个配置 
                .create(); 
 
//        inMemory.put("name4","43"); 
//        System.out.println("从内存中获取" + inMemory.get("name4")); 
//        Thread.sleep(5000); 
////        System.out.println("从内存中获取" + inMemory.get("name4")); 
////        Thread.sleep(5000); 
//        //System.out.println(onDisk.size()); 
//        System.out.println("从磁盘中获取" + onDisk.get("name4")); 
 
//        System.out.println(onDisk.size()); 
//        System.out.println(inMemory.size()); 
//        System.out.println("----------"); 
//        inMemory.put(1,"one"); 
//        System.out.println(inMemory.size()); 
//        System.out.println(onDisk.size()); 
//        System.out.println(inMemory.get(1)); 
//        System.out.println(onDisk.get(1)); 
// 
//        System.out.println("----------"); 
//        Thread.sleep(5000); 
//        System.out.println(inMemory.size()); 
//        System.out.println(onDisk.size()); 
//        System.out.println(inMemory.get(1)); 
//        System.out.println(onDisk.get(1)); 
//        inMemory.put("name","zfx"); 
//        System.out.println("从内存中获取" + inMemory.get("name")); 
//        inMemory.remove("name"); 
//        Thread.sleep(5000); 
//        System.out.println(onDisk.size()); 
//        System.out.println(onDisk.get("name")); 
 
        inMemory.put(1,11); 
        inMemory.put(2,12); 
        inMemory.clearWithExpire(); // 执行这步操作,会触发同步到磁盘。 
        System.out.println(inMemory.get(1)); 
        System.out.println(inMemory.get(2)); 
        Thread.sleep(5000); 
        System.out.println(inMemory.get(1)); 
        System.out.println(inMemory.get(2)); 
        System.out.println(onDisk.size()); 
        System.out.println(onDisk.get(1)); 
        System.out.println(onDisk.get(2)); 
        System.out.println("----"); 
        System.out.println(inMemory.size()); 
        System.out.println(inMemory.get(1)); 
        System.out.println(inMemory.size()); 
 
        dbDisk.close(); 
        inMemory.close(); 
    } 
 
}

本文参考链接:https://www.cnblogs.com/maohuidong/p/15571354.html