如何更改 Jena 中 par 路由的连接数,超过 5 个

How can I change the number of connections par route in Jena, more than 5

我想知道如何在 jena 中修改 par 路由的连接数,当我尝试进行 5 个以上的查询时线程被锁定。我尝试修改 QueryEngineHTTP 中的一些参数,但它不起作用(我也尝试了 qexec.addparam("max connections",10) 和其他变体)。该项目是关于让同义词库中的每个节点(与 属性 连接的节点更窄)所以我使用了一个递归函数,并且在 5 个递归循环之后我被锁定了。太感谢了!

    Query query = QueryFactory.create(queryString);
    if (!occurs.contains(entity)) {
        // print depth times "\t" to retrieve an explorer tree like output
        for (int i = 0; i < depth; i++) {
            System.out.print("\t");
        }
        // print out the URI
        System.out.println(entity); 

        try ( QueryExecution qexec = QueryExecutionFactory.sparqlService("http://data.bnf.fr/sparql", query); ) {

            QueryEngineHTTP objectToExec= (QueryEngineHTTP) QueryExecutionFactory.sparqlService("http://data.bnf.fr/sparql",query);
          //  objectToExec.addParam("timeout","500000"); //5 sec
            objectToExec.addParam("http.conn-manager.timeout","10");                 ResultSet results = qexec.execSelect();

                while (results.hasNext()) {
                    QuerySolution soln = results.nextSolution();
                    RDFNode sub = soln.get("pL");
                    // System.out.println("sub "+sub.toString());
                    if (!sub.isURIResource()) continue;
                    // push this expression on the occurs list before we recurse to avoid loops
                    occurs.add(entity);
                    // traverse down and increase depth (used for logging tabs)
                    traverse(sub.toString(), occurs, depth + 1);
                    // after traversing the path, remove from occurs list
                    occurs.remove(entity);
                }
        }
    }

Apache Jena 使用的默认 HttpClient 设置最多有 5 个连接 per-route(请参阅 code

您需要通过创建所需的 HttpClient 来配置默认 HttpClient 实例,然后使用 HttpOp.setDefaultHttpClient() 方法将其设置为默认客户端。

请参阅 HttpClient Connection Management 文档以了解如何正确配置客户端。可以以上述代码link为基础,进行相应的修改。例如有 20 个最大连接数 per-route 和 100 个总连接数:

HttpClient client =
    HttpClientBuilder.create()
        .useSystemProperties()
        .setRedirectStrategy(new LaxRedirectStrategy())
        .setMaxConnPerRoute(20)
        .setMaxConnTotal(100);
HttpOp.setDefaultHttpClient(client);

请注意,您还需要确保正确释放连接,我看到您在 QueryExecution 上使用了 try-with-resources,它应该会在执行时自动调用 close()这释放了底层连接。但是您永远不会在 ResultSet 上调用 close(),它可能也持有对连接的引用。因此,当您完成结果集或查询执行时,显式调用 close() 永远不会有坏处。

由于您正在进行递归调用,因此您可能希望在递归之前调用 close(),否则如果您的层次结构非常深,您最终仍会 运行 进入此调用。由于您似乎可能对每个结果进行递归,因此您可能无法立即关闭它,因此实际获取结果集的副本可能很有用,这样您就可以在使用 ResultSetFactory.copyResults() 循环结果之前关闭执行