对于我们的一个项目,我使用 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
如果您查看 HTreeMap 类中调度程序初始化的代码,则仅当以下两个条件都为 true 时才会调度后台压缩
配置 #2 可能会产生副作用,这会让你的 HTreeMap 更像是一个缓存。如果你想避免这种情况,你需要将 ttl 设置为 Long.MAX_VALUE
这里的另一种方法是拥有自己的调度程序,它可以使用 HTreeMap API 触发压缩,该 API 在内部检查配置的阈值并执行压缩。请注意,此调用会阻塞 HTreeMap 段的写入
itemsMap.expireEvict()