【问题标题】:Running Hazelcast put() and replace() calls in the calling thread在调用线程中运行 Hazelcast put() 和 replace() 调用
【发布时间】:2018-04-09 22:10:47
【问题描述】:

是否可以强制 Hazelcast 在调用线程的 TransactionalMap 上运行 put()、replace() 和 delete() 方法?我希望 XA 事务从写入 Hazelcast 到写入 MapStore 中的数据库,但 Hazelcast 正在排队更改以在其他线程上运行,因此它们不在同一个事务上下文中。

我已将其设置为直写持久性,但我看到它正在排队 TxnSetOperation 并在单独的线程上运行它们。

这是在 Spring Boot 应用程序中使用 Hazelcast 自动配置和支持 PostgreSQL 的 JPA / Hibernate 存储。

【问题讨论】:

    标签: spring spring-boot hazelcast xa


    【解决方案1】:

    MapStore 操作不在同一个事务上下文中运行。如果您希望使用 Hazelcast 进行事务性持久更新,则需要使用 XA 事务而不启用 MapStore。然后,您可以在上下文中将持久存储设置为不同的 XA 资源。您可以查看 Hazelcast 参考手册中的相关部分:http://docs.hazelcast.org/docs/latest/manual/html-single/index.html#providing-xa-transactions

    【讨论】:

      【解决方案2】:

      Alsparlan 的回答部分正确,但无法在 MapStore 中征用与您对 Hazelcast TransactionalMap 的操作具有相同事务上下文的资源。他提供的链接没有谈论这个(不幸的是),但Javadoc for TransactionalMap 有:

      使用 MapStore 时,对任何 MapStore 方法的调用都超出了事务边界。如果您需要一个跨 Hazelcast 操作和一个其他 XAResources(例如数据库)的 XATransaction,则不应使用 MapStore。相反,在事务中征用这两种资源

      我已经删除了我的 MapStore 使用并将我的 Spring Boot 存储库直接连接到我的服务中,这样我就可以在同一个事务内的相同服务方法中对 Hazelcast 和我的数据源进行更改。与this solution 一起以声明方式加入 Hazelcast XAResource,这对我现在有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-05
        • 2013-05-03
        • 1970-01-01
        • 1970-01-01
        • 2020-09-27
        • 2012-06-22
        • 1970-01-01
        • 2012-08-01
        相关资源
        最近更新 更多