gpt4 book ai didi

java - 带有事务的 Java 缓存

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:34:22 26 4
gpt4 key购买 nike

我想要一个支持事务的简单缓存。简单的意思是我只想在启动时加载所有数据,不需要驱逐等。 (简单的 map 就可以)。

但是它应该支持事务,因为如果对数据库的更改失败,对缓存所做的更改也会回滚。

我听说过 JTA,但它似乎超出了我的需要。如果数据库事务抛出SQLException,手动回滚缓存就可以了。

有什么选择吗?

如果没有,有人可以给我指一个关于 JTA 的好教程吗?例如。示例以及需要什么包/类。注意:我正在创建一个框架,因此它必须能够在没有应用程序容器的情况下独立运行。

编辑:

忘记了 1 个非常重要的问题:

缓存的对象是不可变的!更新意味着用一个等于旧对象的新对象替换它(基于 id 的 equals 方法)。

编辑 2:

写了 JPA 而不是 JTA...

编辑 3:

解释为什么简单的 map 不起作用:

我有 2 种实体类型。我将它们称为复合和元素。一个化合物可以由多个元素组成,每个元素可以出现在多个化合物中。元素由我的框架管理。例如,只能直接添加化合物。用户通过指定其元素来添加新化合物。然后框架选择并退出元素并将其与新的复合关联,或者创建一个新的元素。

我正在缓存所有元素,其中每个元素都包含元素出现在其中的复合 ID 集合。这样做的原因是框架进行了一种特殊的搜索(例如子图同构)。对于每一个这样的搜索,整个!!!数据集(所有元素)需要从数据库加载,因此需要缓存。

因此,如果添加或更新了新的 Compound,则缓存中受影响的元素也必须更新。

解决方法:

做了我在评论中说的: - 将所有更改对象的 ID(=整数)保存在内存中,然后仅在数据库事务提交后更新更改的对象。

private void updateSearchCache(Collection<String> changedIds,
Connection connection) {

synchronized (searchCache) {
for (String id : changedIds) {
Object myObject = getSearchObject(id, connection);
searchCache.put(id, myObject);
}
}
}

最佳答案

您不能将数据放入 Map 事务提交到数据库后,可以吗?

因此,您的 Map 将仅包含数据库中已有的数据。

关于java - 带有事务的 Java 缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9807861/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com