Закрытие 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 после каждого завершения работы сервера и приложения и перед его повторной загрузкой (как мы должны это делать для каждого теста)?

0 ответов

Другие вопросы по тегам