Временная таблица узла mssql потеряна — RequestError: Недопустимое имя объекта '#myTempTable'

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

Проблема

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

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

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

введите описание изображения здесь

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

введите описание изображения здесь

Если это происходит непосредственно перед запуском 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. Нет кости!

Любая помощь приветствуется!

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

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

person Jason    schedule 23.01.2019    source источник
comment
Привет, ты пробовал с другой таблицей? Итак, для моей # таблицы были идентификаторы для временной таблицы на MsSQL.   -  person Sanpas    schedule 23.01.2019
comment
Да, это не подходит для варианта использования, хотя   -  person Jason    schedule 24.01.2019
comment
Это сообщение об ошибке является признаком того, что первоначальный сеанс (или соединение) был закрыт и начался новый. Временная таблица имеет время жизни сеанса. Чтобы решить эту проблему, убедитесь, что ваша логика может сохранять открытые соединения до тех пор, пока таблица #temp больше не понадобится.   -  person Alexander Volok    schedule 27.02.2019


Ответы (2)


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

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

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

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

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

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

person Alexander Volok    schedule 28.02.2019
comment
Спасибо Алексей, спасибо за ответ. мой пул 1 (согласно вопросу). Сейчас проверю на 20. - person Jason; 02.03.2019

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

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

person Brandon    schedule 05.03.2019