相关疑难解决方法(0)

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

我有一个使用JPA,Hibernate和ehcache的应用程序,以及Spring的声明式事务.DB上的负载相当高,因此所有内容都被缓存以加快速度,包括集合.现在,将集合与拥有它们的实体分开缓存并不是秘密,因此如果我删除作为此类缓存集合的元素的实体,则保留应该是其中一个元素的实体,或更新实体以使其成为从一个集合旅行到另一个集合,我必须手工执行驱逐.

所以我使用一个hibernate事件监听器来跟踪插入,删除或更新的实体,并保存该信息,以便在Spring的事务管理器上注册的事务同步.然后,一旦提交事务,同步就执行驱逐.

现在的问题是,很多时候,其他一些并发事务设法在缓存中找到刚刚被驱逐的集合(这些事件通常根据日志分开十分之一秒),并且自然会导致发生EntityNotFoundException.

如何正确同步这些东西?

我尝试在TransactionSynchronization的4个方法中进行逐出(在相对于事务完成的不同时间点调用),它没有帮助.

java collections hibernate transactions ehcache

8
推荐指数
1
解决办法
4738
查看次数

在数据库模式中休眠二级缓存和ON DELETE CASCADE

我们的Java应用程序有大约100个映射到数据库(SQL Server或MySQL)的类.我们使用Hibernate作为我们的ORM(使用XML映射文件).

我们FOREIGN KEY在数据库模式中指定约束.我们的大多数FOREIGN KEY约束也都指明了ON DELETE CASCADE.

我们最近开始启用Hibernate二级缓存(针对流行的实体和集合)来缓解一些性能问题.

自从我们启用了二级缓存后,性能得到了提升.但是我们也开始遇到ObjectNotFoundExceptions.

似乎发生了ObjectNotFoundExceptions,因为数据库正在删除Hibernate 下面的表行.例如,当我们Parent使用Hibernate 删除a 时,数据库模式将ON DELETE CASCADE发送给任何Child实体.这显然没有Hibernates知识,所以它没有机会更新二级缓存(并删除任何已删除的Child实体).

我们相信这个问题的解决方案是ON DELETE CASCADE从我们的数据库模式中删除(但保留FOREIGN KEYs).相反,我们需要配置Hibernate来删除Child正常删除SQL的依赖关系,这也将使Hibernate更新二级缓存.一些有限的测试表明这种方法似乎有效.

我想得到一些社区反馈.我们的问题是否有其他(更好的?)解决方案?其他人如何处理这种情况?通常,在使用ON DELETE CASCADEHibernate的数据库模式中应该考虑哪些权衡?

谢谢.

java hibernate foreign-keys second-level-cache

6
推荐指数
1
解决办法
2178
查看次数