8 java collections hibernate transactions ehcache
我有一个使用JPA,Hibernate和ehcache的应用程序,以及Spring的声明式事务.DB上的负载相当高,因此所有内容都被缓存以加快速度,包括集合.现在,将集合与拥有它们的实体分开缓存并不是秘密,因此如果我删除作为此类缓存集合的元素的实体,则保留应该是其中一个元素的实体,或更新实体以使其成为从一个集合旅行到另一个集合,我必须手工执行驱逐.
所以我使用一个hibernate事件监听器来跟踪插入,删除或更新的实体,并保存该信息,以便在Spring的事务管理器上注册的事务同步.然后,一旦提交事务,同步就执行驱逐.
现在的问题是,很多时候,其他一些并发事务设法在缓存中找到刚刚被驱逐的集合(这些事件通常根据日志分开十分之一秒),并且自然会导致发生EntityNotFoundException.
如何正确同步这些东西?
我尝试在TransactionSynchronization的4个方法中进行逐出(在相对于事务完成的不同时间点调用),它没有帮助.
本质上,您需要做的是在集合正在被驱逐或刚刚被驱逐的情况下强制从数据库读取。实现此目的的一种方法是,在收到驱逐集合的请求后但在进入事务以对其进行更改之前,立即将集合标记为脏集合。任何并发事务都会检查脏标志,如果其设置为 true,则应该从数据库获取数据,否则可以从缓存中读取数据。您可能需要更改数据库事务设置,以便并发事务阻塞,直到更新数据完成,以便从数据库读取正确的数据。交易完成后,您可以将脏标志重置为 false。
只要驱逐持续,您还可以在更新、插入或删除到期时对缓存的集合创建锁。这将确保在驱逐过程完成之前没有其他事务可以读取/更改缓存的集合。
| 归档时间: |
|
| 查看次数: |
4738 次 |
| 最近记录: |