簡體   English   中英

如何在同時保存數據的同時避免spring數據neo4j ogm中的死鎖

[英]how to avoid deadlock in spring data neo4j ogm while saving data concurrently

我一直在嘗試使用帶有1個CPU和1GB RAM的SpringDataNeo4j(SDN)並發加載測試。 對於“ GET”(讀取)請求,能夠以1秒的加速測試1000個線程。 對於“ POST”(寫)請求,但僅能測試18個線程,超出該線程的時間為1秒。 我們面臨DeadLock異常:

由以下原因引起:org.neo4j.ogm.exception.CypherException:執行Cypher“ Neo.TransientError.Transaction.DeadlockDetected”時出錯。 代碼:Neo.TransientError.Transaction.DeadlockDetected; 說明:LockClient [1081]無法等待資源RWLock [NODE(97),hash = 108078135],因為=> LockClient [1081] <-[:HELD_BY]-RWLock [NODE(98),hash = 1267379687] <- [:WAITING_FOR]-LockClient [1076] <-[:HELD_BY]-RWLock [NODE(97),hash = 108078135]

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

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

對於saveService,盡管無法在測試代碼中復制TransactionTemplate ,但我使用默認的@Transactional 我使用DataSourceFactory配置。

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

有什么建議么!

提前致謝!

您可以通過以下方式減少發生死鎖的可能性

  • 使事務更小-例如,不保存1000個節點和關系,而僅保存100個

  • 使用域的結構確保您不會同時更新相同的節點

但是有時無法避免。 在這種情況下,您可以

  • 捕獲異常並重新運行事務(本質上是自己重試)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM