[英]Issue with concurrent POST requests with Jersey REST and Neo4j environment
我有Jersery Rest服務,並且我正在使用Neo4j嵌入式數據庫來處理數據請求。
現在,當我發出並發GET請求時,它可以正常工作。
但是當我發出並發的POST請求時,它給出了以下異常:
Caused by: org.neo4j.kernel.lifecycle.LifecycleException: Component 'org.neo4j.kernel.StoreLockerLifecycleAdapter@62f1ca5e' was successfully initialized, but failed to start. Please see attached cause exception.
at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:504)
at org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:115)
at org.neo4j.kernel.InternalAbstractGraphDatabase.run(InternalAbstractGraphDatabase.java:296)
... 42 more
Caused by: org.neo4j.kernel.StoreLockException: Could not create lock file
at org.neo4j.kernel.StoreLocker.checkLock(StoreLocker.java:85)
at org.neo4j.kernel.StoreLockerLifecycleAdapter.start(StoreLockerLifecycleAdapter.java:40)
at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:498)
我知道問題在於,如果已經有neo4j實例在運行,則無法通過其他線程訪問相同的實例。
解決方案將是Neo4j HA
但是由於我沒有足夠的時間來配置Neo4j HA群集,因此有人可以在如何使POST請求成為單線程方面提出建議嗎(意味着沒有並發線程同時訪問Neo4j)。
任何鏈接或教程。
編輯
我是這樣開始neo4j的:
GraphDatabaseService graphdb = new GraphDatabaseFactory().newEmbeddedDatabase("D:/GraphDB");'
finally
我正在做
graphdb.shutdown();
不確定GET
請求在這種情況下如何工作,也許Neo4j團隊的某人最好提供一個解釋。 我假設您正在初始化和關閉每個請求的graphdb
。 另外,我最近還沒有接觸過Java,我的建議可能不准確。
我認為我要處理的方式是不通過每個請求初始化和關閉graphdb
。 原因是Neo4j鎖定在圖形數據庫目錄上,並且不允許新線程重新初始化同一目錄上的嵌入式實例(讀取線程安全)。 相反,我寧願使用單例類,該類公開graphdb
並將其作為JVM中的共享對象使用。 graphdb.shutdown()
可能會出現在Jersey服務的關閉掛鈎中( graphdb
僅在服務關閉時關閉)。 這與Pangea的建議一致, ServletContextListener
是執行此操作的好地方。 但是,實施方式可能因澤西島而異。
最后,我會禮貌地嘗試通過編輯您的問題,發表評論並詢問有關您問題的背景來尋求幫助的人們。 :)
回答這個問題為時已晚,但是如果有人遇到同樣的問題,這就是我如何解決的問題。 保持單例課程。 即
GraphDatabaseService graphdb=null;
if(graphdb.isAvailable()&& graphdb!=null)
{
return graphdb;
}
else
{
graphdb = new GraphDatabaseFactory().newEmbeddedDatabase("D:/GraphDB");
return graphdb;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.