2017-07-25 35 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