[英]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.