我使用内存中的GemFire和Cassandra作为真相的来源,发现在下面的场景中很难实现全局事务管理器。
使用CacheWriter插入/更新卡桑德拉和GemFire存储库中的数据,以插入/更新GemFire中的记录。如果GemFire或Cassandra出现任何故障,我需要回滚数据。
发布于 2017-06-06 21:44:53
这似乎是我以前回答过的一个问题(最近也是这样)。总之,我找不到它。
我使用枢轴全局事务示例和使用SD的HSQLDB DataSource构建了一个DataSource。
注意:这个示例是我针对Spring (用于Apache )和Spring数据GemFire (用于关键GemFire)的引用实现(RI)的一部分,它展示了枢轴GemFire/Apache、Spring / Geode和Spring的许多功能特性。本
repository-example的重点是使用和扩展将存储库数据访问模式从SD共享应用到Spring上下文中的关键GemFire/Apache。这个例子展示了许多事情(例如CRUD、查询、自定义存储库方法等),基于本地(Cache)和全局(JTA)的事务都是repository-example的一部分。不幸的是,文档在很大程度上仍然是一个WIP。但我确实计划保持这个国际扶轮和最新的例子,因为我也使用代码作为我的会议会谈的基础。不管怎样..。
虽然此示例将关键的GemFire与关系数据库管理系统(即HSQLDB)结合在一起,但可以将HSQLDB替换为。所需要的就是数据源/存储必须符合JTA。
这个示例/测试的配置是这里,并且相当广泛地依赖Spring 这里支持。也就是说,当CLASSPATH (或Spring支持的任何)时,Spring将自动配置基于JTA的事务。当然,您可以使用其他不受支持的JTA事务管理器提供程序,但是您可以自己手动配置它们。如果您愿意,甚至可以手动配置Atomikos,但是Spring的auto-configuration支持非常方便,推荐使用。
唯一需要做的其他事情是让每个数据源都知道JTA事务。
对于关键的GemFire,这需要设置命名上下文(即javax.naming.InitialContext),GemFire本身使用这个上下文来“查找”(按名称)并查找现有的JTA事务。本质上,此bean定义将JTA "TransactionManager“与GemFire在其查找过程中所期望的适当“姓名”相关联。
注意:如果您是在托管环境(例如应用服务器,甚至Tomcat )中,则不需要人工命名上下文,因为它为应用程序提供了命名上下文服务。当然,您需要使用该环境注册JTA事务。但是,由于这是一个独立的(Spring )应用程序,而不是在一个应用程序容器中,所以我在我的模拟/测试命名上下文支持类中使用了Spring的
NamingContextBuilderFactoryBean。
剩下的就是让您查看Apache /DataStax关于让Apache参与JTA事务的文档。然后,您不需要任何关键的GemFire特定类(例如,CacheWriter)来从GemFire更新Cassandra。使用JTA时,所有符合JTA的数据存储都会保持正确,或者不会。
关于关键的GemFire的全球JTA事务支持的更多信息可以找到这里,特别是相关材料这里。
有关Cassandra事务的更多信息可以在启动这里时找到。希望这能有所帮助。
干杯,约翰
https://stackoverflow.com/questions/44398949
复制相似问题