在更新期间模拟Java集合的“已读提交”

时间:2019-04-20 09:53:02

标签: java collections transactions

我的程序中有一个大集合-大约3M个对象。在应用程序的生命周期内,我需要使用增量更新来使此集合保持最新。我正在寻找一种方法来模拟ACID的“读取提交”隔离级别。

为了澄清一点,集合可以有多个属于同一实体的行。执行更新后,必须立即更新同一实体的集合的所有行,因此来自另一个线程的其他事务无法读取任何部分更新。集合的结构不允许一次操作交换同一实体的所有记录,即,该实体的ID不是例如映射中的键。

当前,我不进行增量更新,而是对集合进行完全重新加载,即首先为所有实体生成新集合,然后交换。像这样:

private volatile Map<...> db = new HashMap<>();
...
void synchronized update() {
    var tmpDb = new HashMap<>();
    // populate tmpDb then swap
    db = tmpDb;
}

它可以工作,但是会占用太多内存(当然,稍后会收集垃圾)。

例如,我知道H2具有内存数据库,并且具有Transaction support (read committed)作为功能。我想知道它是如何实现的。也许我可以重用相同的方法。

0 个答案:

没有答案