【发布时间】:2011-12-28 23:49:46
【问题描述】:
我正在尝试找出我应该为我的应用程序(尤其是实体更新)使用哪种缓存并发策略。该应用程序是使用 Hibernate 开发的 Web 服务,部署在 Amazon EC2 集群上并在 Tomcat 上运行,因此那里没有应用程序服务器。
我知道有nonstrict-read-write \ read-write 和transactional 缓存并发策略可以更新和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。其工作原理的简短描述:
- 在这种模式下,Hibernate 自己管理事务。所有数据库 操作必须在事务中,自动提交模式不起作用。
- 在 flush() 期间(在 事务生命周期,但通常发生在提交之前) Hibernate 经历一个会话并搜索 更新/插入/删除的对象。然后首先保存这些对象 到数据库,然后在缓存中锁定和更新所以 并发事务既不能更新也不能读取它们。
- 如果事务随后回滚(显式地或由于某些 错误)被锁定的对象被简单地释放并从 缓存,因此其他事务可以读取/更新它们。
- 如果事务提交成功,则锁定对象为 简单地释放,其他线程可以读/写它们。
是否有一些文档说明它是如何在集群环境中工作的?
事务 缓存似乎可以正常工作,但需要具有独立事务管理器(如 JBossTM、Atomikos、Bitronix)、XA 数据源和大量配置更改和测试的 JTA 环境.我设法部署了它,但我的框架仍然存在一些问题。例如,Google Guice IoC 不支持 JTA 事务,我必须用 Spring 替换它或将服务移动到某个应用程序服务器并使用 EJB。
那么哪种方式更好呢?
提前致谢!
【问题讨论】:
标签: java hibernate caching cluster-computing second-level-cache