我有一个使用 JPA、Hibernate 和 ehcache 以及 Spring 的声明性事务的应用程序。DB 上的负载相当高,因此所有内容都被缓存以加快速度,包括集合。现在,集合与拥有它们的实体分开缓存已经不是什么秘密了,所以如果我删除一个作为此类缓存集合的元素的实体,持久化一个应该是一个元素的实体,或者更新一个实体,使其从一个集合移动到另一个集合,我必须手动执行驱逐。
所以我使用了一个休眠事件监听器,它跟踪被插入、删除或更新的实体,并保存该信息以供在 Spring 的事务管理器中注册的事务同步进行操作。一旦提交事务,同步就会执行驱逐。
现在的问题是,其他一些并发事务经常设法在缓存中找到一个刚刚被驱逐的集合(根据日志,这些事件通常相隔十分之一秒),并且自然会导致 EntityNotFoundException 发生。
如何正确同步这些东西?
我尝试在 TransactionSynchronization 的 4 种方法中的每一种中进行驱逐(在相对于事务完成的不同时间点调用),但没有帮助。