Hibernate L2缓存.集群上的读写或事务缓存并发策略?

And*_*tyn 14 java caching hibernate cluster-computing second-level-cache

我正在试图找出应该为我的应用程序使用哪种缓存并发策略(特别是实体更新).该应用程序是使用Hibernate开发的Web服务,部署在Amazon EC2集群上并在Tomcat上运行,因此没有应用程序服务器.

我知道,有非严格读写\读写事务的可更新并且有成熟的,流行的,生产就绪2L缓存提供Hibernate数据缓存并发策略:Infinispan的,的Ehcache,Hazelcast.

但我并不完全理解Hibernate文档中的事务读写缓存之间的区别.我认为事务缓存是集群应用程序的唯一选择,但现在(在阅读了一些主题之后),我对此并不那么确定.

所以我的问题是关于读写缓存.它是集群安全的吗?它是否保证数据库和缓存之间的数据同步以及所有连接的服务器之间的同步?或者它只适用于单服务器应用程序,我应该总是喜欢事务缓存?

例如,如果正在更新实体字段(名字等)的数据库事务失败并已回滚,那么读写缓存是否会丢弃更改,或者只是填充错误数据(更新后的名字)到所有其他节点?这需要JTA交易吗?

JBoss TreeCache并发策略配置作为第二级Hibernate缓存主题说:

'READ_WRITE`是一个有趣的组合.在这种模式下,Hibernate本身就是一个轻量级的XA协调器,所以它不需要一个完整的外部XA.它的工作原理简短说明:

  1. 在这种模式下,Hibernate管理事务本身.所有数据库操作必须在事务内,自动提交模式将不起作用.
  2. 在flush()期间(可能在事务生存期内多次出现,但通常在提交之前发生)Hibernate会通过一个会话并搜索更新/插入/删除的对象.然后,这些对象首先保存到数据库,然后在高速缓存中锁定和更新,因此并发事务既不能更新也不能读取它们.
  3. 如果事务随后被回滚(显式或由于某些错误),则锁定的对象被简单地释放并从缓存中逐出,因此其他事务可以读取/更新它们.
  4. 如果事务成功提交,则只需释放锁定的对象,其他线程可以读/写它们.

是否有一些文档如何在集群环境中工作?

似乎事务高速缓存正常工作,但需要JTA环境与独立事务管理器(如JBossTM,Atomikos,Bitronix),XA数据源以及大量配置更改和测试.我设法部署了这个,但我的框架仍然存在一些问题.例如,Google Guice IoC不支持JTA事务,我必须用Spring替换它或将服务移动到某个应用程序服务器并使用EJB.

那么哪种方式更好?

提前致谢!

Ach*_*how 19

差异摘要

  • NonStrict R/w和R/W都是异步策略,这意味着它们在事务完成后更新.
  • Transactional显然是同步的,并在事务中更新.
  • Nonstrict R/w从不锁定实体,因此总是有可能读取脏话.
  • 读写始终软锁定实体,因此任何同时访问都将发送到数据库.但是,R/W很可能不会产生可重复读取隔离.

理解这些策略之间差异的最佳方法是查看它们在插入,更新或删除操作过程中的行为方式.

您可以在此处查看我的帖子 , 其中更详细地介绍了这些差异.随意评论.


Gal*_*eño 5

到目前为止,我只看到群集2LC与事务缓存模式一起使用。这正是Infinispan所做的,实际上,Infinispan到目前为止还没有实现其他缓存并发模式。为了减轻事务负担,Infinispan通过与Hibernate(而非XA)的事务同步进行集成。

  • 不。读写可以使事情保持一致,但是它需要使用某种2PC方法或其他方法来确保集群中的一致性。这取决于2LC的实现。Infinispan选择跳过读写并使用事务,该事务用于包含所有操作并在集群周围自动执行操作。 (2认同)