![](/img/trans.png)
[英]Neo4j-Spring Data- How to avoid a nested property to be a node in a neo4j
[英]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-retry或guava-retrying
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.