如何更改 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()
循环结果之前关闭执行
我想知道如何在 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()
循环结果之前关闭执行