我们使用OpenLink Virtuoso作为NodeJS项目的主数据库管理器 . 我们仅通过HTTP SPARQL endpoints 使用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探查器的屏幕截图在哪里:

enter image description here

在每次服务器和应用程序关闭之后以及再次启动之前,有没有办法强制所有HTTP连接到virtuoso关闭(因为我们必须为每个测试执行此操作)?