Несколько одновременных подключений в узле к mssql

Я использую node с express и mssql, и запрос к базе данных работает нормально. Однако, если я передаю 2 одновременных запроса в одно и то же время, я получаю:

UnhandledPromiseRejectionWarning: ConnectionError: база данных уже подключена! Вызовите close перед подключением к другой базе данных.

var express = require('express'); // Web Framework
var app = express();
var sql = require('mssql/msnodesqlv8');



    const pool = new sql.ConnectionPool({
        database: 'db123',
        server: 'server1',
        driver: 'msnodesqlv8',
        options: {
            trustedConnection: true
        },
    })

    var conn = pool;


var server = app.listen(5001, function () {
    var host = server.address().address
    var port = server.address().port
    console.info("app listening at http://%s:%s", host, port)
});



// GET: SQL Stored procedure return time codes
app.get('/codes/:userid/:showclosed', function (req, res) {
    conn.connect().then(function () {
        var request = new sql.Request(conn);
        request.input('userid', req.params.userid);
        request.input('showclosed', parseInt(req.params.showclosed));
        request.execute('sel_new', function(err, recordsets, returnValue, affected) {
            if (err) console.info(err);
            res.end(JSON.stringify(recordsets)); // Result in JSON format
            conn.close();
        })
    })
    })

Обновлено:

Вот что у меня получилось:

app.get('/codes/:userid/:showclosed', function (req, res) {
    //const pool1 = new sql.ConnectionPool(config);
   (async function () {
    try {
        let pool = await conn;
        // Stored procedure       
        let result2 = await pool.request()
            .input('userid', req.params.userid)
            .input('showclosed', parseInt(req.params.showclosed))
            .execute('StoredProcedure1', function(err, recordsets, returnValue, affected) {
                if (err) console.info(err);
                res.end(JSON.stringify(recordsets)); // Result in JSON format
                //sql.close();
            })
    } catch (err) {
        console.info(err);
    }
})()

sql.on('error', err => {
    console.info(err);
})
})
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
3 338
1

Ответы 1

Вы не должны использовать conn.connect() для каждого запроса, это инициализирует пул соединений и должен использоваться при запуске вашей службы.

Итак, вы хотите, чтобы conn.connect() появился сразу после var conn = pool. Это даст указание пулу соединений открыть соединение с базой данных, которое ваше приложение может затем использовать по запросу на различных конечных точках. Вы можете увидеть пример этого в документация библиотеки mssql. Код открывает соединение с sql.connect(), а затем использует объект sql для создания и выполнения SQL-запросов. В вашем примере вы бы использовали conn, а не sql. Я сам не использовал библиотеку, но, похоже, это то, что предлагает документация.

Вы также не должны закрывать соединение после вызова базы данных, поскольку вы, возможно, не догадались, что это закроет весь пул соединений. Идея состоит в том, чтобы открыть пул подключений и оставить их на время работы службы, однако вы должны обязательно запускать conn.close() на этапе завершения работы.

Спасибо, это помогло. Я прокомментирую свой исходный вопрос своим решением.

Dylan 17.12.2018 19:41

@Dylan, если бы это был тот ответ, который вам нужен, не могли бы вы принять его для людей, которые будут искать ту же проблему в будущем. В противном случае вы должны сами опубликовать свое решение в качестве ответа и сделать его правильным :)

Elliot Blackburn 18.12.2018 12:22

Привет, @ElliotBlackburn, а что, если у меня есть веб-сервер, который всегда должен работать? Есть ли у вас предложения, когда закрыть бассейн? Спасибо.

nypogi 29.06.2019 05:51

@nypogi, закройте пул, когда сервер остановится по какой-либо причине. Возможно, он отключится, чтобы вы могли развернуть новую версию, или если он упадет из-за необработанных исключений. Не забывайте всегда устанавливать максимальное количество подключений в вашей БД выше, чем используется вашим сервером, в противном случае сервер, который плохо блокируется или не может отключиться, все равно может задерживать все ваши подключения к БД.

Elliot Blackburn 30.06.2019 21:21

@Dylan, не могли бы вы принять этот ответ, нажав галочку? Похоже, это решило вашу проблему, да и некоторые другие люди тоже.

Elliot Blackburn 30.06.2019 21:21

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