有效地使用MapDB(对提交感到困惑)

时间:2013-08-19 19:58:52

标签: java mapdb

我在一个处理数十亿需要映射/排队的对象的项目中使用MapDB。程序完成后我不需要任何持久性(MapDB数据库都是临时的)。我希望程序尽可能快地运行,但我对MapDB的commit()函数感到困惑(我认为这与性能有关),即使在阅读docs之后也是如此。我的问题:

  1. 提交究竟做了什么?我的工作理解是它将对象从堆序列化到磁盘,从而释放堆空间。这准确吗?

  2. 对刚刚提交的对象的引用会发生什么?它们是否被GC清理干净,或者它们以某种方式“引用”磁盘上的对象(使用MapDB使其透明?)

  3. 最终我想知道如何尽可能高效地使用MapDB,但是如果不知道commit()是什么,我就不能这样做。我非常感谢您有效使用MapDB的任何其他建议。

2 个答案:

答案 0 :(得分:3)

commit操作是对transactions的操作,就像您在数据库系统中找到的那样。 MapDB实现了事务,因此commit实际上是“使我对此数据库所做的更改永久保持且对其他用户可见”。免费操作是rollback,它会丢弃您在当前交易中所做的所有更改。提交不会(直接)影响内存中的内容和内存中的内容。如果您正在尝试回收堆空间,可能需要查看compact()

对于你的第二个问题,如果你持有对象的强引用,那么你继续持有那个强引用。 MapDB不会为你删除它。在大多数情况下,您应该将MapDB视为普通的Java Map。当您调用get时,MapDB会隐藏它是在内存中还是在磁盘上,并且只返回对检索到的对象的可用引用。检索到的对象将在内存中徘徊,直到它变成垃圾,就像其他任何东西一样。

答案 1 :(得分:0)

最好不要在对您制作的地图进行每次更改后尝试提交,而是按照某种计划执行此操作。

喜欢

  • 每次if(is_array($_POST["menu"][$key])){ 更改
  • N
  • 在代码中使用某种逻辑检查点后。

执行太多提交会使您的应用程序变得非常慢。