【问题标题】:Infinispan 9.1: Unsupported async cache mode 'REPL_ASYNC' for transactional cachesInfinispan 9.1:事务缓存不支持异步缓存模式“REPL_ASYNC”
【发布时间】:2017-12-31 03:15:44
【问题描述】:

我正在将项目从 8.2.4.Final 迁移到 Infinispan 9.1.0.Final 并遇到下一个异常:

org.infinispan.commons.CacheConfigurationException:ISPN000441:事务缓存不支持异步缓存模式“REPL_ASYNC”

相关代码:

new ConfigurationBuilder()
            .jmxStatistics()
            .enabled(false)
            .available(false)
            .clustering()
            .cacheMode(CacheMode.REPL_ASYNC)
            .stateTransfer().awaitInitialTransfer(false)
            .transaction()
            .transactionManagerLookup(new DummyTransactionManagerLookup())
            .transactionMode(TransactionMode.TRANSACTIONAL)
            .lockingMode(LockingMode.PESSIMISTIC)
            .recovery()
            .enabled(false)
            .invocationBatching()
            .enable(false)
            .indexing()
            .index(Index.ALL)
            .addProperty("default.indexmanager", "near-real-time")
            .addProperty("default.directory_provider", "ram")
            .addProperty("default.worker.execution", "sync")
            .addProperty("default.exclusive_index_use", "true")
            .addProperty("default.reader.strategy", "shared")
            .build();

和问题组合在这里,但在 8.2.4.Final 版本中效果很好。

.cacheMode(CacheMode.REPL_ASYNC)
.transactionMode(TransactionMode.TRANSACTIONAL) // Maybe is there another way to lock put operations?

我应该如何重新配置​​缓存以保存其特征?

【问题讨论】:

    标签: java caching infinispan infinispan-9


    【解决方案1】:

    事务缓存的异步模式并不安全,因为它在向TransactionManager 报告之前没有等待集群中每个节点中的事务提交。如果您不走运,它可能会使您的数据不一致。

    为避免出现任何问题,已将其删除。请升级您的配置以改用REPL_SYNC

    此外,DummyTransactionManagerLookup 已被弃用,应将其替换为 EmbeddedTransactionManagerLookup

    8.x 和 9.x 之间还有其他与事务相关的更改。请查看升级指南 (http://infinispan.org/docs/stable/upgrading/upgrading.html#upgrading_from_8_x_to_9_0) 了解更多详情。

    【讨论】:

    • 这是有效的解决方案,但应用程序经常将元素放入分布式缓存的一部分,现在,使用 REPL_ASYNC,更新的节点会通知其他节点有关此事件的信息。他们会自动更新自己的缓存实例。使用 REPL_SYNC 请求的节点必须要求其他节点提供新元素,因此 put 的延迟将充分增加。你有什么建议?
    • 我不确定我是否了解您的用例,但您真的进行交易吗?非事务性缓存仍然可以使用异步模式。如果您不需要 put(k,v) 中的先前值,您可以设置 IGNORE_RETURN_VALUES 如下:AdvanceCache.withFlags(IGNORE_RETURN_VALUES).put(k,v),但它仍然需要远程获取锁(如果节点不是锁所有者)。
    猜你喜欢
    • 2014-07-15
    • 2021-05-25
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 2021-05-09
    • 2020-06-06
    相关资源
    最近更新 更多