2017-08-30 74 views
0

我一直在嘗試使用帶有1個CPU和1GB RAM的SpringDataNeo4j(SDN)同時加載測試。 對於'GET'(讀取)請求,可以測試1000個線程,並且加速時間爲1秒。 對於'POST'(寫入)請求,但只能使用18個線程以1秒的斜升進行測試,超出此線程。我們面臨着死鎖例外:如何避免同時保存數據的彈簧數據neo4j ogm中的死鎖

造成的:org.neo4j.ogm.exception.CypherException:錯誤執行暗號 「Neo.TransientError.Transaction.DeadlockDetected」;代碼:Neo.TransientError.Transaction.DeadlockDetected;描述:LockClient [1081]不能等待資源RWLock [NODE(97),hash = 108078135],因爲=> LockClient < - [:HELD_BY] - RWLock [NODE(98),hash = 1267379687] < - [:WAITING_FOR] - LockClient [1076] < - [:HELD_BY] - rwlock中[NODE(97),散列= 108078135]

我所提到 http://neo4j.com/docs/java-reference/current/#transactions-deadlocks

TransactionTemplate template = new TransactionTemplate().retries(5).backoff(3, TimeUnit.SECONDS); 

對於saveService,我使用默認@Transactional,雖然我無法在測試代碼中複製TransactionTemplate。我使用我的DataSourceFactory配置。

@Configuration 
@PropertySource(value = { "classpath:ogm.properties" } 
@EnableNeo4jRepositories(basePackages = "com.my.graph.repository") 
@EnableTransactionManagement 

任何建議!

在此先感謝!

+0

什麼是您在寫測試中使用的Cypher語法? –

+0

我在這方面沒有使用密碼。我正在使用OGM的'Dao.save(node)'API擴展GraphRepository – SriRamaChandra

回答

4

您可以減少死鎖通過

  • 發生使交易更小的可能性 - 例如而不是保存1000個節點和關係,僅保存100

  • 使用域的結構,確保你不會同時更新同一節點

但有時這是不可能避免的。在這些情況下,您可以

  • 捕獲異常,並重新運行交易(主要是自己做重試)

    int retries = 5; 
    while (retries > 0) { 
        try { 
        fooService.foo(bar); 
        } catch (CypherException ex) { 
        retries--; 
        Thread.sleep(delay); 
        } 
    } 
    
  • 使用一些已經實現重試邏輯,像spring-retryguava-retrying

+0

非常感謝!我將開始實施。 – SriRamaChandra

+0

我已經實現了節點保存的自定義重試機制,正如您所建議的那樣,我發現了一些改進。總是覺得不一致。僵局仍然會減少請求 – SriRamaChandra