我们使用OpenLink Virtuoso作为NodeJS项目的主数据库管理器。我们仅通过HTTP SPARQL端点使用SPARQL查询来查询数据库。为此,我们使用request-promise库,具有以下配置:
const queryRequest = rp({
method: "POST",
uri: queryObject.fullUrl,
form: {
query: queryObject.query,
maxrows: queryObject.maxRows,
format: queryObject.resultsFormat
},
headers: {
'content-type': 'application/x-www-form-urlencoded'
},
json: true,
forever : true, // Keep connections alive instead of creating new ones
timeout : Config.dbOperationTimeout,
})
.then(function (parsedBody) {
运行我们的测试时,我们会启动应用程序(新的快速应用程序对象和nodejs服务器)数百次,并尝试干净地关闭它。该应用程序关闭,服务器也,但我认为virtuoso连接保持打开,因为虽然我们正在尝试重用现有连接,但连接数量仍在缓慢增加。
close()方法(拆除应用程序)运行这些功能:
const closePendingConnections = function(callback)
{
async.map(Object.keys(self.pendingRequests), function(queryID, cb)
{
if(self.pendingRequests.hasOwnProperty(queryID))
{
self.pendingRequests[queryID].cancel(cb) //try to abort all requests in the queue
}
}, callback);
};
const destroyQueue = function(callback)
{
self.q.destroy(callback);
};
在大约150次测试(启动和关闭)之后,查询开始失败并且测试停止。我们尝试使用队列来确保在给定时间每个应用程序启动只有一个与virtuoso的连接是活动的。打印待处理连接数会在队列中不断显示0或1个请求,因此我知道这不是队列的问题。
运行这些测试后,virtuoso Profiler的屏幕截图位于何处:
在每次服务器和应用程序关闭之后以及再次启动之前,有没有办法强制所有HTTP连接到virtuoso关闭(因为我们必须为每个测试执行此操作)?