【问题标题】:Store Lock Issue on Neo4jNeo4j 上的存储锁定问题
【发布时间】:2016-02-18 11:59:17
【问题描述】:

得到以下异常

java.lang.RuntimeException: 启动错误 org.neo4j.kernel.EmbeddedGraphDatabase 在 org.neo4j.kernel.InternalAbstractGraphDatabase.run(InternalAbstractGraphDatabase.java:335) 在 org.neo4j.kernel.EmbeddedGraphDatabase.(EmbeddedGraphDatabase.java:59) 在 org.neo4j.graphdb.factory.GraphDatabaseFactory.newDatabase(GraphDatabaseFactory.java:108) 在 org.neo4j.graphdb.factory.GraphDatabaseFactory$1.newDatabase(GraphDatabaseFactory.java:95) 在 org.neo4j.graphdb.factory.GraphDatabaseBuilder.newGraphDatabase(GraphDatabaseBuilder.java:176) 在 org.neo4j.graphdb.factory.GraphDatabaseFactory.newEmbeddedDatabase(GraphDatabaseFactory.java:67) 在 com.tpgsi.mongodb.dataPollingWithOplog.ORBCreateLink.main(ORBCreateLink.java:62) 引起:org.neo4j.kernel.lifecycle.LifecycleException:组件 '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 在 sun.nio.ch.SharedFileLockTable.checkList(FileLockTable.java:255) 在 sun.nio.ch.SharedFileLockTable.add(FileLockTable.java:152) 在 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 对象作为全局变量并在任何地方使用它。只有交易,我正在关闭。我没有为 graphdb 对象使用 registerShutDownHook() 和关闭函数。我不使用这些函数的原因是,我在具有多个执行程序的风暴环境中运行它,如果我们将关闭它,那么对于每个线程我都必须再次创建它,这也不好。 我在想不关闭graphdb可能是原因。 如果我使用一个执行器运行相同的代码,它可以正常工作,但多个执行器会出现锁定问题。 谁能告诉我要怎么做才能驾驭它。

【问题讨论】:

    标签: neo4j apache-storm


    【解决方案1】:

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

    一次只有一个 GDB 可以访问存储目录。

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

    【讨论】:

    • 谢谢迈克尔,会按照你的建议尝试。
    【解决方案2】:

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

    【讨论】:

    • 如果 neo4j 已经在运行并且在它上面运行应用程序肯定会给出锁异常。
    【解决方案3】:

    我在 Storm 环境中使用多个 worker 和 executor 执行我的代码。由于多个工作人员正在创建多个 graphdb 安装,并且我遇到了存储锁定异常。我将worker的数量更改为1并创建graphdb对象,我编写了单例类以确保我一次只创建一个graphdb对象,并且它是一个全局变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-12
      相关资源
      最近更新 更多