使用Jersey REST和Neo4j环境的并发POST请求问题

时间:2013-09-20 12:20:37

标签: java rest jersey neo4j

我有 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();

2 个答案:

答案 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;
        }