MapDB 后台压缩

问题描述 投票:0回答:1

对于我们的一个项目,我使用 MapDB 作为持久键/值存储。我正在使用由文件支持的 HTreeMap,并且想知道如何在后台启用压缩。

final DB mapDB = DBMaker.fileDB(...).transactionEnable().executorEnable().closeOnJvmShutdown().make();
final HTreeMap<> itemsMap = mapDB.hashMap(..., Serializer.STRING,
        custom_serializer).expireExecutor(
            Executors.newScheduledThreadPool(3)).expireCompactThreshold(
                0.4).counterEnable().createOrOpen();

代码与上面不完全相同,但类似。有人可以让我知道我错过了什么吗?我根本没有看到文件被压缩。我缺少什么?

问候, -C

key-value-store mapdb
1个回答
0
投票

如果您查看 HTreeMap 类中调度程序初始化的代码,则仅当以下两个条件都为 true 时才会调度后台压缩

  1. 已配置 ScheduledExecutorService
  2. 启用expireAfterUpdate、expireAfterDelete或expireAfterCreate其中之一 https://github.com/gigliovale/-mapdb/blob/master/src/main/java/org/mapdb/HTreeMap.kt#L145

配置 #2 可能会产生副作用,这会让你的 HTreeMap 更像是一个缓存。如果你想避免这种情况,你需要将 ttl 设置为 Long.MAX_VALUE

这里的另一种方法是拥有自己的调度程序,它可以使用 HTreeMap API 触发压缩,该 API 在内部检查配置的阈值并执行压缩。请注意,此调用会阻塞 HTreeMap 段的写入

itemsMap.expireEvict()
© www.soinside.com 2019 - 2024. All rights reserved.