Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate/Ehcache:从二级缓存中逐出集合,但与其他数据库读取不同步_Java_Hibernate_Collections_Transactions_Ehcache - Fatal编程技术网

Java Hibernate/Ehcache:从二级缓存中逐出集合,但与其他数据库读取不同步

Java Hibernate/Ehcache:从二级缓存中逐出集合,但与其他数据库读取不同步,java,hibernate,collections,transactions,ehcache,Java,Hibernate,Collections,Transactions,Ehcache,我有一个使用JPA、Hibernate和ehcache的应用程序,以及Spring的声明性 交易。DB上的负载相当高,因此缓存所有内容以加快速度, 包括收藏。现在,单独缓存集合已不是秘密 从拥有它们的实体中删除,因此如果我删除一个实体,该实体是此类 缓存的集合,持久化应该是其中一个元素的实体,或更新 实体,以便它从一个集合移动到另一个集合,我必须执行逐出 用手 所以我使用了一个hibernate事件监听器,它跟踪实体被插入、删除和删除的情况 或更新并保存该信息,以便在Spring的 事务管理器来

我有一个使用JPA、Hibernate和ehcache的应用程序,以及Spring的声明性 交易。DB上的负载相当高,因此缓存所有内容以加快速度, 包括收藏。现在,单独缓存集合已不是秘密 从拥有它们的实体中删除,因此如果我删除一个实体,该实体是此类 缓存的集合,持久化应该是其中一个元素的实体,或更新 实体,以便它从一个集合移动到另一个集合,我必须执行逐出 用手

所以我使用了一个hibernate事件监听器,它跟踪实体被插入、删除和删除的情况 或更新并保存该信息,以便在Spring的 事务管理器来执行操作。然后,同步执行逐出操作 事务已提交

现在的问题是经常有其他并发事务设法找到它 缓存中刚刚被逐出的集合(这些事件通常是一个事件的十分之一) 第二次(根据日志),自然会导致EntityNotFoundException发生

如何正确同步这些内容

我尝试在TransactionSynchronization的4种方法中的每种方法中执行逐出(这
在与事务完成相关的不同时间点调用),它没有帮助。

基本上,您需要做的是在集合正在处理或刚刚被逐出的情况下强制从数据库读取。一种方法是,在收到收回请求后,但在进入事务更改之前,将集合标记为脏集合。出现的任何并发事务都将检查dirty标志,如果其设置为true,则应从数据库中获取数据,否则它可以从缓存中读取数据。您可能需要更改数据库事务设置,以便在更新数据的事务完成之前阻止并发事务,以便从数据库中读取正确的数据。一旦事务完成,您就可以将脏标志重置为false


当更新、插入或删除到期时,您还可以在缓存的集合上创建一个锁,直到逐出持续。这将确保在逐出过程完成之前,没有其他事务可以读取/更改缓存的集合。

为什么不能使集合保持最新?i、 e.添加对象时,将该对象添加到其所属的集合中。删除对象时,请将其从其所在的集合中删除。根据我的经验,在hibernate或jpa中使用缓存时,对象的状态(而不是数据库的状态)是缓存的,因此需要确保内存中的对象模型与数据库中的对象模型同步


还是我遗漏了什么?为什么您不能简单地保持收藏的最新状态?

我想您必须参考以下链接:-
请参见,hibernate实际上并没有从缓存中删除对象。。rest u可以从上面的链接得到答案

顺便说一句,它被逐出事务之外。我得找API把它们标脏,谢谢。另外,我如何使Hibernate在您建议添加的锁上同步?显然,PersistentCollection的脏标志不起作用,因为不同的事务获得同一集合的不同实例。至于锁,我将在下一步研究它,如果有人给我指出正确的API,我将非常感激。据我所知,EhCache不支持锁定,首先,它是一个多线程应用程序,传递具有最新集合的同一个最新实例似乎有点困难,因为有各种并发操作需要不同的时间才能完成,我倾向于使用EntityManager.getById获取实体的最新状态。