在使用嵌入式Neo4j(1.8.3)的java应用程序中,我已经将org.neo4j.graphdb.index.UniqueFactory.UniqueNodeFactory
子类化,并且在其中包含此方法:
@Override
public Node getOrCreateIndexedNode(final String key, final Object value) {
LOG.debug("Get or creating {} Node using [{}={}]", new Object[] { this.type, key, value });
final Node node = super.getOrCreate(key, value);
LOG.debug("Got or created {} {} using [{}={}]", new Object[] { this.type, node, key, value });
return node;
}
有时这次对getOrCreate(key, value)
的调用永远不会返回。众所周知,在申请被退回之前,它会丢失5个小时。
可能的原因是什么? 有哪些可能的解决方案?
(Neo4j实例有大约2500万个节点)
答案 0 :(得分:1)
您可能遇到了一个没有释放上一次运行资源的锁。即仍然持有索引锁定的事务:阻止您的线程继续。
确保所有其他交易正在进行并正确完成。
线程转储可能有助于查看哪个其他线程保持相同的锁定。
如果您正在运行Neo4j Enterprise,您可以通过JMX检查当前打开的交易。
有关Neo4j锁定的更多信息:
答案 1 :(得分:1)
从1.8.x
升级到1.9.x
版neo4j
修正了此问题,而没有任何其他更改。