временная таблица узла mssql потеряна - RequestError: Неверное имя объекта '#myTempTable' - PullRequest
0 голосов
/ 23 января 2019

Я использую node-mssql и подключаюсь к серверу sql 2017 года из docker.

Проблема

Во всем сценарии я поставил

var test = await dbRequest().batch("SELECT * FROM #myTestTable");

Периодически я получаю сообщение об ошибке RequestError: Invalid object name '#myTempTable'.Поэтому я поместил несколько часов в свой sql.ConnectionPool, чтобы определить, какие условия вызывают ошибку.Оказывается, на большинстве строк исполнения переменная pool.pool.available равна 1, как показано ниже.

enter image description here

Всякий раз, когда происходит ошибка, непосредственно передпереходя к следующей строке, pool.pool.available будет 0 следующим образом:

enter image description here

Если это произойдет непосредственно перед запуском var test = await dbRequest().batch("SELECT * FROM #myTestTable");

Сбой при RequestError: Invalid object name '#myTempTable'

Что я пробовал

Я пытался отправить конфигурацию пула в Tedious с помощью {min: 100, max: 1000, log: true},но, к сожалению, это, кажется, игнорируется (https://www.npmjs.com/package/mssql#connection-pools)

var sqlServerProperty = {
    user: '',
    password: '',
    server: '192.168.1.13',
    database: 'CCTDB',
    pool: {min: 1, 
        max: 100, 
        idleTimeoutMillis: 30000}
};

Я также пробовал только один pool.request () и запускаю все dbRequests из этого. Никаких кубиков!

Anyпомощь оценена!

Как выглядит dbRequest ()?

// the entire script is wrapped in an async function
        var pool = new sql.ConnectionPool(sqlServerProperty);
        await pool.connect();
        var dbRequest = ( () => { return pool.request() });

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Чтобы убедиться, что все партии в серии выполняются по одному соединению, вы также можете использовать Транзакции: https://www.npmjs.com/package/mssql#transaction

Обратите внимание, что транзакции будут блокировать записи до фиксации, что может привести к блокировке в базе данных.

0 голосов
/ 28 февраля 2019

Это сообщение об ошибке является просто признаком того, что начальный сеанс (или соединение) был закрыт и начался новый. Временная таблица имеет время жизни сеанса. Чтобы устранить эту проблему, убедитесь, что ваша логика может сохранять открытые соединения, пока таблица #temp больше не нужна

Я не эксперт по nodejs, но быстрое исследование говорит:

Существует четкий способ сделать это - просто инициализировать соединение с Параметр pool.min установлен в 1 (или выше) . Это означает, что должно быть в хотя бы одно активное соединение в пуле. Чем выше число, тем больше одновременные активные соединения.

Вы пробовали что-то вроде ?:

pool: {min: 20, 
        max: 100, 
        idleTimeoutMillis: 30000}

В этом случае будет установлено больше соединений, поэтому большее их количество будет доступно в определенный момент времени, и вероятность того, что ваш сеанс будет закрыт, потому что он будет использоваться кем-то другим, будет уменьшена

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...