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