在Neo4j上存储锁定问题

时间:2016-02-18 11:59:18

标签: neo4j apache-storm

获得以下异常

  

java.lang.RuntimeException:启动时出错   org.neo4j.kernel.EmbeddedGraphDatabase           在org.neo4j.kernel.InternalAbstractGraphDatabase.run(InternalAbstractGraphDatabase.java:335)           在org.neo4j.kernel.EmbeddedGraphDatabase。(EmbeddedGraphDatabase.java:59)           at org.neo4j.graphdb.factory.GraphDatabaseFactory.newDatabase(GraphDatabaseFactory.java:108)           at org.neo4j.graphdb.factory.GraphDatabaseFactory $ 1.newDatabase(GraphDatabaseFactory.java:95)           at org.neo4j.graphdb.factory.GraphDatabaseBuilder.newGraphDatabase(GraphDatabaseBuilder.java:176)           at org.neo4j.graphdb.factory.GraphDatabaseFactory.newEmbeddedDatabase(GraphDatabaseFactory.java:67)           在com.tpgsi.mongodb.dataPollingWithOplog.ORBCreateLink.main(ORBCreateLink.java:62)   引起:org.neo4j.kernel.lifecycle.LifecycleException:Component   'org.neo4j.kernel.StoreLockerLifecycleAdapter@5b6ca687'原为   已成功初始化,但未能启动。请参照附件   引起异常。           在org.neo4j.kernel.lifecycle.LifeSupport $ LifecycleInstance.start(LifeSupport.java:513)           在org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:115)           在org.neo4j.kernel.InternalAbstractGraphDatabase.run(InternalAbstractGraphDatabase.java:331)           ... 6更多引起:org.neo4j.kernel.StoreLockException:无法获取l文件:   /home/aps/neo4j-community-2.2.3/CompleteTest/store_lock。请确保   没有其他进程正在使用此数据库,并且该目录是   可写(即使只读访问也需要)           在org.neo4j.kernel.StoreLocker.checkLock(StoreLocker.java:78)           在org.neo4j.kernel.StoreLockerLifecycleAdapter.start(StoreLockerLifecycleAdapter.java:44)           在org.neo4j.kernel.lifecycle.LifeSupport $ LifecycleInstance.start(LifeSupport.java:507)           ... 8更多引起:java.nio.channels.OverlappingFileLockException           at sun.nio.ch.SharedFileLockTable.checkList(FileLockTable.java:255)           at sun.nio.ch.SharedFileLockTable.add(FileLockTable.java:152)           at sun.nio.ch.FileChannelImpl.tryLock(FileChannelImpl.java:1087)           在java.nio.channels.FileChannel.tryLock(FileChannel.java:1154)           在org.neo4j.io.fs.StoreFileChannel.tryLock(StoreFileChannel.java:135)           在org.neo4j.io.fs.FileLock.wrapFileChannelLock(FileLock.java:38)           在org.neo4j.io.fs.FileLock.getOsSpecificFileLock(FileLock.java:99)           在org.neo4j.io.fs.DefaultFileSystemAbstraction.tryLock(DefaultFileSystemAbstraction.java:85)           在org.neo4j.kernel.StoreLocker.checkLock(StoreLocker.java:74)

我有一个创建图形的过程,在完成此操作后,我还有一个过程可以在if之上创建更多关系。但是我在完成第一个进程后运行第二个进程时遇到异常。我检查过Neo4j的数据目录没有被任何进程使用但仍然遇到锁定问题。

我运行了一段代码来创建图表。

   static GraphDatabaseFactory dbFactory = null; 
   static GraphDatabaseService graphdb  = null;  

  static{
dbFactory =new GraphDatabaseFactory();
  graphdb  = dbFactory.newEmbeddedDatabase(com.tpgsi.mongodb.dataPollingWithOplog.CommonConstants.NEO4J_DATA_DIRECTORY);
  }

  try{
Transaction tx = graphdb.beginTx();
  try
 {
    // creating Node and relationships

    tx.success();
  } catch (Exception e) {
            tx.failure();
            e.printStackTrace();
   } finally {
       tx.close();
    }
      }
     catch(Exception e)
     {
        e.printStackTrace();
     }

我已经将graphdb对象创建为全局变量并在任何地方使用它。只有交易,我即将结束。我没有使用registerShutDownHook()和关闭graphdb对象的函数。我不使用这些函数的原因是因为,我在具有多个执行程序的风暴环境中运行它,如果我们将关闭它,那么对于每个线程我必须再次创建它,这也是不好的。 我在想不关闭graphdb可能是原因。 如果我使用One executor运行相同的代码,它可以正常工作,但多个执行程序会出现锁定问题。 任何人都可以告诉我我必须做些什么才能获得它。

3 个答案:

答案 0 :(得分:0)

图形数据库实例是线程安全的,因此您可以在所有螺栓中使用它,只需将其作为全局变量进行访问。

一次只能有一个GDB访问商店目录。

否则创建一个服务,您的风暴螺栓通过其他协议访问/使用,例如http或二进制。

答案 1 :(得分:0)

我遇到了同样的问题。但我的错误是我在服务器运行时执行了程序。如果我停止服务器,则程序执行成功。

答案 2 :(得分:0)

我在风暴环境中使用多个worker和executor执行我的代码。由于多个worker正在创建多个graphdb安装,我得到了商店锁定异常。我将worker的数量更改为1并创建了graphdb对象,我编写了单例类,以确保我一次只创建一个graphdb对象,这是一个全局变量。