Несколько одновременных подключений в узле к mssql - PullRequest
0 голосов
/ 17 декабря 2018

Я использую узел с экспресс и 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.log("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.log(err);
            res.end(JSON.stringify(recordsets)); // Result in JSON format
            conn.close();
        })
    })
    })

EDIT:

Вот что я закончил:

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.log(err);
                res.end(JSON.stringify(recordsets)); // Result in JSON format
                //sql.close();
            })
    } catch (err) {
        console.log(err);
    }
})()

sql.on('error', err => {
    console.log(err);
})
})

1 Ответ

0 голосов
/ 17 декабря 2018

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

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

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

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