Закрытие OpenLink Virtuoso HTTP-подключений
Мы используем OpenLink Virtuoso в качестве основного менеджера баз данных для проекта NodeJS. Мы запрашиваем базу данных, используя только запросы SPARQL, через конечную точку HTTP SPARQL. Для этого мы используем библиотеку запроса-обещания со следующей конфигурацией:
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) сотни раз и также пытаемся его аккуратно закрыть. Приложение закрывается, сервер тоже, но я думаю, что виртуальные соединения остаются открытыми, потому что число соединений продолжает медленно расти, хотя мы пытаемся повторно использовать существующие соединения.
Метод 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 тестов (загрузок и выключений) запросы начинают давать сбои и тесты останавливаются. Мы попытались использовать очередь, чтобы гарантировать, что только одно соединение с виртуозом активно для каждой загрузки приложения в данный момент времени. Печать числа ожидающих соединений показывает постоянно 0 или 1 запрос в очереди, поэтому я знаю, что это не проблема очереди.
Где скриншот виртуозного профилировщика после выполнения этих тестов:
Есть ли способ принудительно закрыть все HTTP-подключения к virtuoso после каждого завершения работы сервера и приложения и перед его повторной загрузкой (как мы должны это делать для каждого теста)?