2017-07-25 36 views
2

我从8.2.4.Final迁移项目Infinispan的9.1.0.Final,并得到一个异常:Infinispan的9.1:不支持异步缓存模式 'REPL_ASYNC' 的事务缓存

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? 

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

回答

2

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

为了避免任何问题,它被删除。请升级您的配置以改为使用REPL_SYNC

此外,DummyTransactionManagerLookup已弃用,应由EmbeddedTransactionManagerLookup替换。

8.x和9.x之间还有其他与交易相关的变化。请参阅升级指南(http://infinispan.org/docs/stable/upgrading/upgrading.html#upgrading_from_8_x_to_9_0)了解更多详情。

+0

它是工作的解决方案,但应用程序经常将元素放入分布式缓存的一部分,现在,使用REPL_ASYNC,更新的节点会通知其他人关于此事件。他们自动更新自己的缓存实例。用REPL_SYNC请求节点必须要求其他给出新元素,因此put的延迟将被充分增加。你有什么建议? –

+0

我不确定我是否理解你的用例,但是你真的有交易吗?非事务性高速缓存仍然可以使用异步模式。 如果您不需要来自put(k,v)的前一个值,那么可以设置IGNORE_RETURN_VALUES,如: AdvanceCache.withFlags(IGNORE_RETURN_VALUES).put(k,v), 但它需要远程获取锁(如果节点不是锁拥有者)。 – pruivo