如何使用文件持久化 Chronicle Map 实现事务行为

How to achieve transaction behaviour with file persisted Chronicle Map

所有,

我正在尝试将时间序列存储在 Chronicle Map 中。该系列被分成块,每个块都是一个单独的地图条目。我想知道是否有人知道如果当前正在将条目写入 Chronicle Map 时 JVM 退出会发生什么(当 BytesMarshaller 正在序列化时)?

内存映射文件会以损坏的数据结束吗?有解决办法吗??

将新条目放入 Chronicle Map 时,这是通过单个原子操作提交的。 IE。如果 JVM 在任意时刻退出,在 put 操作期间,您可能会遇到以下影响:

  • map.size() 如果与实际数据同步,+- 1
  • 内存泄漏(用于存储条目的内存)

但你保证不会拥有:

  • 损坏的条目(在 JVM 退出时被放置)、错误的键或为正确的键放置的错误值,可以通过任何方式观察到:既不是通过查询键也不是通过迭代
  • JVM 退出时已经存在于映射中的任何其他条目已损坏。
  • 对于任何 Chronicle Map 实例没有 contract/behavioral 更改,映射到同一个文件,与退出的 JVM 中的实例并行,或者仅在退出之后映射(例如,当 JVM 再次启动时) ).特别是,您将能够毫无问题地放入带有密钥的条目,该密钥在 JVM 退出时被放入。

另一方面,关于 Chronicle Map 版本 3.x,有一件重要的事情是,在这样的 JVM 退出之后,一个 Chronicle Map 段(条目被放入其中)将被锁定.您可以手动清除锁定状态,或等待 when corresponding API is addedChronicle Map2.x不是这样,等待2秒后抢锁