【问题标题】:Hibernate L2 cache. Read-write or transactional cache concurrency strategy on cluster?休眠二级缓存。集群上的读写或事务缓存并发策略?
【发布时间】:2011-12-28 23:49:46
【问题描述】:

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

我知道有nonstrict-read-write \ read-writetransactional 缓存并发策略可以更新和Hibernate 有成熟、流行、生产就绪的 2L 缓存提供程序:Infinispan、Ehcache、Hazelcast。

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

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

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

Concurrency strategy configuration for JBoss TreeCache as 2nd level Hibernate cache 话题说:

“READ_WRITE”是一个有趣的组合。在这种模式下休眠 它本身作为一个轻量级 XA 协调器工作,因此它不需要 成熟的外部 XA。其工作原理的简短描述:

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

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

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

那么哪种方式更好呢?

提前致谢!

【问题讨论】:

    标签: java hibernate caching cluster-computing second-level-cache


    【解决方案1】:

    差异总结

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

    了解这些策略之间差异的最佳方式 是查看它们在插入、更新或 删除操作。

    你可以看看我的帖子 here 它更详细地描述了差异。 欢迎发表评论。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 你的意思是说读写缓存策略是集群安全的,但大多数时候使用的是事务性的?
      • 不。读写可以使事情保持一致,但它确实需要某种 2PC 方法或其他方法来保证集群中的一致性。这取决于 2LC 的实施。 Infinispan 选择跳过读写并使用事务,它用于包含所有操作并在集群周围原子地行动。
      猜你喜欢
      • 2011-12-27
      • 1970-01-01
      • 2010-12-22
      • 2013-05-29
      • 2011-03-07
      • 2010-10-20
      • 1970-01-01
      • 2012-04-30
      相关资源
      最近更新 更多