Neo4j 3.0.6中的查询超时

时间:2016-10-21 03:01:43

标签: neo4j

现在看来,以前的工作方法已被弃用:

unsupported.dbms.executiontime_limit.enabled=true
unsupported.dbms.executiontime_limit.time=1s

根据documentation新变量负责超时处理:

dbms.transaction.timeout
dbms.transaction_timeout

同时新变量看起来与交易相关。

新的超时变量看起来不起作用。它们在neo4j.conf中设置如下:

dbms.transaction_timeout=5s
dbms.transaction.timeout=5s

缓慢的密码查询未终止。

然后添加Neo4j插件以使用事务建模慢查询:

    @Procedure("test.slowQuery")
    public Stream<Res> slowQuery(@Name("delay") Number Delay )
    {
        ArrayList<Res> res = new ArrayList<>();

        try ( Transaction tx = db.beginTx() ){
            Thread.sleep(Delay.intValue(), 0);
            tx.success();
        } catch (Exception e) {
            System.out.println(e);
        }

        return res.stream();
    }

插件提供的功能是使用新主义Golang包执行的。并且也不会触发超时。

2 个答案:

答案 0 :(得分:0)

只有当您的过程代码调用图形上的任何操作(如读取节点和rels)或显式检查当前事务是否标记为终止时,才会超时超时。

对于后者,请参阅https://github.com/neo4j-contrib/neo4j-apoc-procedures/blob/master/src/main/java/apoc/util/Utils.java#L41-L51作为示例。

答案 1 :(得分:0)

根据文件,交易警卫只对孤儿交易感兴趣。

  

服务器使用超时防止孤立事务。如果在超时期限内没有对给定事务的请求,则服务器将回滚它。您可以通过将dbms.transaction_timeout设置为超时前的秒数来配置服务器配置中的超时。默认超时为60秒。

我找不到如何为未使用本机功能孤立的查询触发超时的方法。

@StefanArmbruster指出了一个好方向。可以通过在Neo4j插件中创建包装函数来获得超时触发功能,就像在apoc中创建一样。