我有一些在自己的线程中运行的任务,每个任务执行一个包装Cypher查询的方法,该查询收集一些统计信息并更新一些节点。
该方法标记为@Transactional(使用Spring)
每个线程执行相同的查询,使用不同的节点id参数进行开始
现在,偶尔会有一些线程“挂起”或执行时间过长,我希望能够中断它们。
所以我使用Executors.newSingleThreadScheduledExecutor()编写了一个类,以便在某个超时后安排cancel()。
发生的事情是我得到各种各样的例外,与事务有关。应用日志
org.neo4j.kernel.impl.nioneo.store.UnderlyingStorageException:无法加载位置[3822] @ [34398]
引起:javax.transaction.xa.XAException:逻辑日志无法标记1P-commit [4]
引起:java.nio.channels.ClosedByInterruptException:null 在java.nio.channels.spi.AbstractInterruptibleChannel.end(AbstractInterruptibleChannel.java:184)〜[na:1.6.0_65]
Neo4j版本是1.9.5嵌入式,在Mac上运行 有什么想法吗?
答案 0 :(得分:2)
中断线程不是一个好主意。 ESP。与nio奇怪的事情发生。
我认为在Neo4j中使用内置机制要好得多。
Stefan Armbruster写了一篇关于如何使用“Guard”机制来阻止长时间运行cypher查询的博客,请看这里:
http://blog.armbruster-it.de/2013/09/some-experiments-with-ratpack-and-neo4j/
查看“终止查询”部分&代码。
答案 1 :(得分:0)
我在github上创建了一个问题,只是为了看看Matrix团队对此有何看法。到目前为止,我非常喜欢Neo4j,但对我来说这是真正的问题。
https://github.com/neo4j/neo4j/issues/3977#issuecomment-74735972
由于更多原因,我不喜欢防护解决方案,因此我编写了一些小线程类,它解决了中断问题。它不能完全解决长时间运行的查询问题,因为它将继续在后台运行,但您的代码不会等待它完成。 我已经测试了几天,感觉很实用。