Neo4J BatchInserter和多线程

时间:2017-01-13 06:41:09

标签: java multithreading neo4j neo4j-batch-inserter

我使用Neo4J BatchInserter从头开始构建一个大型数据库。我使用多个线程从BatchInserter读取数据并同步写入。

问题:在尝试读取属性

时迟早会遇到异常
  • 在DirectRecordAccess.putInBatc
  • 中启用了断言
  • 禁用断言我在PropertyRecord.next中得到一个ArrayIndexOutOfBounds

    线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:4 在org.neo4j.kernel.impl.store.record.PropertyRecord.next(PropertyRecord.java:190) 在org.neo4j.kernel.impl.store.record.PropertyRecord.next(PropertyRecord.java:41) 在org.neo4j.kernel.impl.transaction.state.Loaders $ 2.ensureHeavy(Loaders.java:189) 在org.neo4j.kernel.impl.transaction.state.Loaders $ 2.ensureHeavy(Loaders.java:161) at org.neo4j.unsafe.batchinsert.DirectRecordAccess $ DirectRecordProxy.forReadingData(DirectRecordAccess.java:174) at org.neo4j.unsafe.batchinsert.DirectRecordAccess $ DirectRecordProxy.forReadingData(DirectRecordAccess.java:115) 在org.neo4j.kernel.impl.transaction.state.PropertyTraverser.getPropertyChain(PropertyTraverser.java:65) at org.neo4j.unsafe.batchinsert.internal.BatchInserterImpl.getPropertyChain(BatchInserterImpl.java:1000) 在org.neo4j.unsafe.batchinsert.internal.BatchInserterImpl.getNodeProperties(BatchInserterImpl.java:900)

JavaDoc声明:“一次只有一个线程可以对批量插入器起作用,执行并发访问的多个线程必须采用同步。”

问题(S):

  • BatchInserter Thread-Safe是否为只读操作?
  • 如果是,只要没有并发只读线程请求当前写入的数据,是否可以安全地进行同步写入?

感谢您的反馈!

吕迪格尔

1 个答案:

答案 0 :(得分:0)

抱歉打扰 - 我应该像现在一样对它进行测试。所以对于所有想知道的人:似乎你甚至需要序列化读取访问 - 或者确保你不要尝试同时读取相同的属性。

我测试了什么:

  • 使用BatchInserter创建100个节点,每个节点都有一个String-Attribute
  • 编写2个线程,尝试从无限循环中的节点获取属性

出了什么:

  • 当两个线程从不同节点读取属性时,一切都很好
  • 当线程从同一节点读取时,抛出以下异常

    线程“Thread-2”中的异常java.util.NoSuchElementException     在org.neo4j.kernel.impl.store.record.PropertyRecord.next(PropertyRecord.java:187)     在org.neo4j.kernel.impl.store.record.PropertyRecord.next(PropertyRecord.java:41)     在org.neo4j.kernel.impl.transaction.state.PropertyTraverser.getPropertyChain(PropertyTraverser.java:66)     at org.neo4j.unsafe.batchinsert.internal.BatchInserterImpl.getPropertyChain(BatchInserterImpl.java:1000)     at org.neo4j.unsafe.batchinsert.internal.BatchInserterImpl.getNodeProperties(BatchInserterImpl.java:900)     在org.hucompute.wikidragon.core.test.BatchInserterTest $ ReadThread.run(BatchInserterTest.java:56)

祝福,

吕迪格尔

相关问题