Я использую 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);
})
})
Вы не должны использовать conn.connect()
для каждого запроса, это инициализирует пул соединений и должен использоваться при запуске вашей службы.
Итак, вы хотите, чтобы conn.connect()
появился сразу после var conn = pool
. Это даст указание пулу соединений открыть соединение с базой данных, которое ваше приложение может затем использовать по запросу на различных конечных точках. Вы можете увидеть пример этого в документация библиотеки mssql. Код открывает соединение с sql.connect()
, а затем использует объект sql
для создания и выполнения SQL-запросов. В вашем примере вы бы использовали conn
, а не sql
. Я сам не использовал библиотеку, но, похоже, это то, что предлагает документация.
Вы также не должны закрывать соединение после вызова базы данных, поскольку вы, возможно, не догадались, что это закроет весь пул соединений. Идея состоит в том, чтобы открыть пул подключений и оставить их на время работы службы, однако вы должны обязательно запускать conn.close()
на этапе завершения работы.
@Dylan, если бы это был тот ответ, который вам нужен, не могли бы вы принять его для людей, которые будут искать ту же проблему в будущем. В противном случае вы должны сами опубликовать свое решение в качестве ответа и сделать его правильным :)
Привет, @ElliotBlackburn, а что, если у меня есть веб-сервер, который всегда должен работать? Есть ли у вас предложения, когда закрыть бассейн? Спасибо.
@nypogi, закройте пул, когда сервер остановится по какой-либо причине. Возможно, он отключится, чтобы вы могли развернуть новую версию, или если он упадет из-за необработанных исключений. Не забывайте всегда устанавливать максимальное количество подключений в вашей БД выше, чем используется вашим сервером, в противном случае сервер, который плохо блокируется или не может отключиться, все равно может задерживать все ваши подключения к БД.
@Dylan, не могли бы вы принять этот ответ, нажав галочку? Похоже, это решило вашу проблему, да и некоторые другие люди тоже.
Спасибо, это помогло. Я прокомментирую свой исходный вопрос своим решением.