我有 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();
答案 0 :(得分:2)
在这种情况下,不确定GET
请求是如何工作的,也许来自Neo4j团队的人可以提供最好的解释。我假设您正在初始化并关闭graphdb
每个请求。另外,我最近没有和Java联系,我的建议可能不准确。
我认为我会处理这个问题的方法是不初始化并关闭graphdb
每个请求。原因是Neo4j锁定了图形数据库目录,并且不允许新线程重新初始化同一目录中的嵌入式实例(读取线程安全)。相反,我宁愿使用暴露graphdb
的单例类,并将其重新用作JVM中的共享对象。 graphdb.shutdown()
可能出现在Jersey服务的关闭挂钩中(graphdb
仅在服务中断时关闭)。这与Pangea建议的一致,ServletContextListener
是一个很好的地方。但是,泽西岛的实施可能会有所不同。
最后,我会通过编辑你的问题,评论和询问有关你问题的背景来帮助那些寻求帮助的人。 :)
答案 1 :(得分:1)
GraphDatabaseService graphdb=null;
if(graphdb.isAvailable()&& graphdb!=null)
{
return graphdb;
}
else
{
graphdb = new GraphDatabaseFactory().newEmbeddedDatabase("D:/GraphDB");
return graphdb;
}