我正在试图找出应该为我的应用程序使用哪种缓存并发策略(特别是对于实体更新)。该应用程序是使用Hibernate开发的Web服务,部署在Amazon EC2集群上并在Tomcat上运行,因此没有应用程序服务器。
我知道有可用于更新的数据的 nonstrict-read-write \ 读写和事务性缓存并发策略Hibernate有成熟的,流行的,生产就绪的2L缓存提供商:Infinispan,Ehcache,Hazelcast。
但我并不完全理解Hibernate文档中事务性和读写缓存之间的区别。我认为事务性缓存是集群应用程序的唯一选择,但现在(在阅读了一些主题之后),我对此并不十分肯定。
所以我的问题是关于读写缓存。它是集群安全的吗?它是否保证数据库和缓存之间的数据同步以及所有连接的服务器之间的同步?或者它只适用于单服务器应用程序,我应该总是喜欢事务性缓存?
例如,如果正在更新实体字段(名字等)的数据库事务失败并已回滚,那么读写缓存是否会丢弃更改,或者只是将坏数据(更新的名字)填充到所有其他节点? 这需要JTA交易吗?
Concurrency strategy configuration for JBoss TreeCache as 2nd level Hibernate cache主题说:
'READ_WRITE`是一个有趣的组合。在这种模式下Hibernate 它本身作为一个轻量级的XA协调器,因此它不需要 全面的外部XA。简要说明它的工作原理:
- 在这种模式下,Hibernate管理事务本身。所有DB 动作必须在事务内部,自动提交模式将不起作用。
- 在flush()期间(可能会出现多次) 事务生命周期,但通常在提交之前发生) Hibernate会经历一个会话并进行搜索 更新/插入/删除的对象。然后首先保存这些对象 到数据库,然后在缓存中锁定和更新 并发事务既不能更新也不能读取它们。
- 如果事务随后被回滚(明确地或因为某些事务而被回滚) 错误)锁定的对象被简单地释放并逐出 缓存,因此其他事务可以读取/更新它们。
- 如果事务成功提交,则锁定的对象为 简单地发布,其他线程可以读/写它们。
醇>
是否有一些文档说明它在群集环境中如何工作?
似乎事务性缓存正常工作,但需要JTA环境与独立事务管理器(如JBossTM,Atomikos,Bitronix),XA数据源以及大量配置更改和测试。我设法部署了这个,但我的框架仍然存在一些问题。例如,Google Guice IoC不支持JTA事务,我必须将其替换为Spring或将服务移至某个应用程序服务器并使用EJB。
那么哪种方式更好?
提前致谢!
答案 0 :(得分:19)
差异摘要
了解这些策略之间差异的最佳方式 是看他们在插入,更新或过程中的行为方式 删除操作。
你可以查看我的帖子 here 其中更详细地描述了差异。 随意评论。
答案 1 :(得分:5)
到目前为止,我只看到了集群式2LC使用事务缓存模式。这正是Infinispan所做的,事实上,Infinispan迄今为止还没有实现其他缓存并发模式。为了减轻交易负担,Infinispan通过事务同步与Hibernate集成而不是XA。