节点 mssql 并发请求结果 "Connection is closed"
node mssql concurrent request resulting "Connection is closed"
我正在使用节点 js 的 mssql 包,每条路由我正在创建一个新连接并执行事务,当我从客户端并行调用两个 apis 时,mssql 抛出 "Connection is closed"
示例:当 api 同时调用 "Connection is closed" 时
router.get('/', async function (req, res, next) {
let result = {};
try {
let pool = await sql.connect(db);
try {
let sqlResponse = await pool.request().execute('p_getAllData');
result = {
status: true,
data: sqlResponse.recordsets[0]
}
pool.close();
} catch (e) {
pool.close();
throw e;
}
} catch (e) {
result = {
status: false,
data: e.message
}
console.log(e);
}
res.send(result);
});
我不会为每个请求创建池并在每个请求时关闭它。这是非常低效的。您应该在启动服务器并重新使用它时创建一次连接池。
这样的方法
let pool;
app.listen(port, async () => {
console.log(`Example app listening on port ${port}!`);
pool = await sql.connect("connectionstring");
});
在你的路线中,你基本上像平常一样使用游泳池。
更合适的方法是创建一个包含所有相关方法的 dbOperation 文件,并在您的路由中使用它们。
我正在使用节点 js 的 mssql 包,每条路由我正在创建一个新连接并执行事务,当我从客户端并行调用两个 apis 时,mssql 抛出 "Connection is closed"
示例:当 api 同时调用 "Connection is closed" 时
router.get('/', async function (req, res, next) {
let result = {};
try {
let pool = await sql.connect(db);
try {
let sqlResponse = await pool.request().execute('p_getAllData');
result = {
status: true,
data: sqlResponse.recordsets[0]
}
pool.close();
} catch (e) {
pool.close();
throw e;
}
} catch (e) {
result = {
status: false,
data: e.message
}
console.log(e);
}
res.send(result);
});
我不会为每个请求创建池并在每个请求时关闭它。这是非常低效的。您应该在启动服务器并重新使用它时创建一次连接池。
这样的方法
let pool;
app.listen(port, async () => {
console.log(`Example app listening on port ${port}!`);
pool = await sql.connect("connectionstring");
});
在你的路线中,你基本上像平常一样使用游泳池。
更合适的方法是创建一个包含所有相关方法的 dbOperation 文件,并在您的路由中使用它们。