我在内存中使用GemFire,而Cassandra则充当真相的来源,并发现很难为以下场景实现全局事务管理器。
使用CacheWriter
插入/更新Cassandra和GemFire存储库中的数据,以便在GemFire中插入/更新记录。如果GemFire或Cassandra出现任何故障,我需要回滚数据。
答案 0 :(得分:1)
这似乎是我之前回答过的一个问题(最近也是如此)。无论如何,我找不到它。
我使用 Pivotal GemFire 和使用SD JPA的HSQLDB DataSource
构建了Global Transaction example。
注意:此示例是我的Contacts Application 参考实现(RI)的一部分,用于 Spring Data Geode (用于 Apache Geode )和 Spring Data GemFire (用于 Pivotal GemFire )展示了 Pivotal GemFire / Apache Geode , Spring Data GemFire的许多功能特性/ Geode 和 Spring 一般。此
repository-example
侧重于使用Spring Data Commons的存储库基础结构和扩展将SD Commons 中的存储库数据访问模式应用于 Pivotal GemFire / Apache Geode 在 Spring 上下文中。在此示例显示的许多内容中(例如,CRUD,查询,自定义存储库方法等),基于本地(缓存)和基于全局(JTA)的事务都是repository-example
的一部分。不幸的是,文档仍然主要是WIP。但我确实计划保持这个RI和示例最新,因为我也使用代码作为我的会议谈判的基础。总之...
虽然这个例子将 Pivotal GemFire 与RDBMS(即HSQLDB)结合在一起,但可以换掉HSQLDB,例如Apache Cassandra。所需要的只是数据源/存储符合JTA。
此示例/测试的配置为here,并且相当广泛地依赖于 Spring Boot " 自动配置"支持。也就是说,当Atomikos (open source JTA Transaction Manager) is on the CLASSPATH
(或 Spring Boot 支持的任何JTA事务管理器)时, Spring Boot 将auto-configure基于JTA的事务。当然,您可以使用不受支持的其他JTA事务管理器提供程序,但您可以自己手动配置它们。您甚至可以根据需要手动配置Atomikos,但 Spring Boot 自动配置支持非常方便且值得推荐。
唯一需要的是让每个数据源都知道JTA事务。
对于 Pivotal GemFire ,这需要setting up GemFire 本身使用的命名上下文(即javax.naming.InitialContext
)以便"查找" (按名称)并找到现有的JTA交易。从本质上讲,这个bean definition与JTA" TransactionManager
"相关联。与GemFire在查找过程中所期望的"name"一起使用。
注意:如果您位于托管环境(例如应用程序服务器,甚至Tomcat)中,则不需要人工命名上下文,因为它为您的应用程序提供了命名上下文服务。当然,那么您需要在该环境中注册JTA Transaction。但是,由于这是一个不在应用程序容器中的独立( Spring Boot )应用程序,因此我在mock/test Naming context support类中使用了Spring
NamingContextBuilderFactoryBean
。
剩下的就是让您查看Apache Cassandra / DataStax的文档,了解如何让Apache Cassandra参与JTA交易。然后,您不需要任何 Pivotal GemFire 特定类(例如CacheWriter
)来更新GemFire中的Cassandra。使用JTA,所有符合JTA标准的数据存储都可以正确保留,或者不是。
有关Pivotal GemFire全球JTA交易支持的更多信息,请参见here,具体而言,相关材料here。
更多关于Cassandra交易可以从here开始找到。希望这会有所帮助。
干杯, 约翰