0

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

2 回答 2

2

不确定GET在这种情况下请求是如何工作的,也许 Neo4j 团队的某个人最好提供解释。我假设您正在初始化和关闭graphdb每个请求。另外,我最近没有接触Java,我的建议可能不准确。

我认为我处理这个问题的方式是初始化和关闭graphdb每个请求。原因是 Neo4j 锁定了图形数据库目录,并且不允许新线程重新初始化同一目录上的嵌入式实例(读取线程安全)。相反,我宁愿使用一个单例类,它公开并重graphdb用它作为 JVM 中的共享对象。graphdb.shutdown()可能发生在您的 Jersey 服务的关闭挂钩中(graphdb仅在服务关闭时关闭)。这与 Pangea 的建议一致,ServletContextListener是执行此操作的好地方。但是,实施可能因泽西岛而异。

最后,我会对那些试图通过编辑您的问题、评论和询问有关您的问题的上下文来提供帮助的人保持礼貌。:)

于 2013-11-18T12:06:12.160 回答
1

回答这个问题为时已晚,但如果有人面临同样的问题,我就是这样解决的。维护一个单例类。IE,

      GraphDatabaseService graphdb=null;
      if(graphdb.isAvailable()&& graphdb!=null)
       {
            return graphdb;
       }
       else
        {
           graphdb = new GraphDatabaseFactory().newEmbeddedDatabase("D:/GraphDB");
         return graphdb;
        }
于 2014-06-24T06:45:58.240 回答