我有一些任务是在它们自己的线程中运行的,每个任务都执行一个方法,该方法包装了一个Cypher查询,该查询收集一些统计信息并更新一些节点。
该方法被标记为@Transactional (使用Spring)
每个线程执行相同的查询,开始时使用不同的节点id param。
现在,偶尔会出现一些线程“挂起”或执行时间过长的情况,我希望能够中断它们。
因此,我使用Executors.newSingleThreadScheduledExecutor()编写了一个类,以便在某个超时之后安排一个cancel()。正在发生的是,我得到了各种各样的异常,事务相关的。App日志
org.neo4j.kernel.impl.nioneo.store.UnderlyingStorageException:无法加载position3822 @34398 由: java.nio.channels.spi.AbstractInterruptibleChannel.end(AbstractInterruptibleChannel.java:184) ~na:1.6.0_65 : java.nio.channels.ClosedByInterruptException: null引起的无法标记1P-提交4的逻辑日志引起的
Neo4j版本是1.9.5嵌入式的,运行在Mac上有什么想法吗?
发布于 2014-01-21 23:48:34
打断线程不是个好主意。Esp。奇怪的事情发生了。
我认为在Neo4j中使用内置机制更好。
Stefan Armbruster写了一个关于如何使用“卫士”机制来停止长时间运行的密码查询的博客,请参见这里:
http://blog.armbruster-it.de/2013/09/some-experiments-with-ratpack-and-neo4j/
查看“终止查询”部分和代码。
发布于 2015-02-17 22:36:20
测试用例和解决方法
我在github上制造了一个问题,只是为了看看矩阵小组对此有什么看法。到目前为止,我非常喜欢Neo4j,但这对我来说是个真正的问题。
https://github.com/neo4j/neo4j/issues/3977#issuecomment-74735972
我不喜欢保护解决方案,因为更多的原因,所以我写了一个小线程类,这解决了中断的问题。它不能完全解决长期运行的查询问题,因为它将继续在后台运行,但您的代码不会等待它完成。我已经测试了几天了,感觉很有用。
https://stackoverflow.com/questions/21263446
复制相似问题