Java 休眠二级缓存。集群上的读写或事务缓存并发策略?

Java 休眠二级缓存。集群上的读写或事务缓存并发策略?,java,hibernate,caching,cluster-computing,second-level-cache,Java,Hibernate,Caching,Cluster Computing,Second Level Cache,我正试图找出我的应用程序应该使用哪种缓存并发策略(尤其是实体更新)。该应用程序是一个使用Hibernate开发的web服务,部署在AmazonEC2集群上,在Tomcat上工作,因此那里没有应用服务器 我知道,对于可以更新的数据,有非严格的读写\读写和事务性缓存并发策略,并且Hibernate有成熟的、流行的、生产就绪的2L缓存提供程序:Infinispan、Ehcache、Hazelcast 但是我并不完全理解Hibernate文档中事务缓存和读写缓存之间的区别。我原以为事务性缓存是集群应用程

我正试图找出我的应用程序应该使用哪种缓存并发策略(尤其是实体更新)。该应用程序是一个使用Hibernate开发的web服务,部署在AmazonEC2集群上,在Tomcat上工作,因此那里没有应用服务器

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

但是我并不完全理解Hibernate文档中事务缓存和读写缓存之间的区别。我原以为事务性缓存是集群应用程序的唯一选择,但现在(在阅读了一些主题之后),我不太确定这一点

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

例如,如果更新实体字段(名字等)的数据库事务失败并已回滚,读写缓存会放弃更改,还是只将坏数据(更新的名字)填充到所有其他节点? 这是否需要JTA交易

主题是:

“读写”是一个有趣的组合。在此模式下休眠 它本身是一个轻量级XA协调器,因此不需要 完全成熟的外部XA。简要说明其工作原理:

  • 在此模式下,Hibernate管理事务本身。所有数据库 操作必须在事务内部,自动提交模式将不起作用
  • 在flush()期间(在 事务生存期,但通常发生在提交之前) Hibernate执行一个会话并搜索 更新/插入/删除的对象。然后首先保存这些对象 到数据库,然后在缓存中锁定和更新以便 并发事务既不能更新也不能读取它们
  • 如果事务随后回滚(显式回滚或由于某些原因回滚) 错误)锁定的对象被简单地释放并从 缓存,以便其他事务可以读取/更新它们
  • 如果事务提交成功,则锁定的对象将被删除 简单地释放,其他线程可以读/写它们
  • 是否有一些文档说明这在集群环境中是如何工作的

    事务缓存似乎可以正确地实现这一点,但需要具有独立事务管理器(如JBossTM、Atomikos、Bitronix)的JTA环境、XA数据源以及大量配置更改和测试。我成功地部署了它,但我的框架仍然存在一些问题。例如,GoogleGuice IoC不支持JTA事务,我必须用Spring替换它,或者将服务移动到某个应用服务器并使用EJB

    那么哪种方式更好呢


    提前谢谢

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

    差异摘要

    • 非严格R/w和R/w都是异步策略,这意味着它们 在事务完成后更新
    • 事务性是 显然是同步的,并且在事务中更新
    • 非严格R/w从不锁定实体,因此总是有可能 肮脏的读物
    • 读写总是软锁定一个实体,所以 同时访问被发送到数据库。然而,有一个问题 R/w可能不会产生可重复读取隔离的远程机会
    了解这些策略之间差异的最佳方法 是查看它们在插入、更新或删除过程中的行为 删除操作

    你可以查看我的帖子 更详细地描述了这些差异。
    请随意评论。

    您的意思是说读写缓存策略是群集安全的,但大多数情况下使用的是事务性的吗?不。读写可以使事情保持一致,但它需要使用某种2PC方法或其他方法来保证集群中的一致性。这取决于2LC的实现。Infinispan选择跳过读写和使用事务,事务用于包含所有操作,并围绕集群进行原子化操作。