目前我有基于文件从mapDb创建的hashmap . 我正在使用这个 Map 在服务器上本地保存一些数据(我不需要其他服务器来访问这些数据),所以我需要在jvm重启后这些数据可用 . 这非常有效 .

但是,当jvm死亡时,我还需要报道一个案例 . 这意味着我们不能保证将调用db.close(),但我仍然需要在恢复后检索数据 .

这是创建 Map 的方式:

DB db = DBMaker
            .fileDB(storagePath)
            .closeOnJvmShutdown()
            .fileMmapEnableIfSupported()
            .fileMmapPreclearDisable()
            //.checksumHeaderBypass()
            //.transactionEnable() 
            .allocateStartSize(entries * avgEntrySize)
            .make();
    db.getStore().fileLoad();
    Map map = db.hashMap("map", Serializer.LONG, Serializer.ELSA).createOrOpen();

我找到了两种方法:

创建 db

  • 添加 checksumHeaderBypass 选项,但我想知道后果会是什么?在这种情况下,db可以在恢复后返回一些不一致的数据吗?我问,因为作为替代方案我使用 chronicleMap 并且它也有一个 close() 方法,但它不强制在重新启动jvm之前执行此调用 .

  • 添加 transactionEnable 选项,但是我需要在每次更新后调用 commit 或实现一些wrapper来执行此操作 . 但问题是 commit 在每次通话中实际上做了什么?以及它将如何影响性能?它会将mmaped文件刷新到磁盘吗?我正在使用mmaped文件,因为我需要真正快速访问数据 . 部分关于 commit 写的是here,但它没有给出这个问题的明确答案 .

或者可能有其他方法可以做到这一点?