我正在使用节点js的mssql软件包,每条路由都在创建一个新的连接并执行事务,当我从客户端并行调用两个api时,mssql抛出“连接已关闭”
示例:当同时调用此api时,“连接已关闭”即将出现
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);
});
答案 0 :(得分:1)
我不会为每个请求创建该池并为每个请求关闭它。这是非常低效的。启动服务器并重新使用该连接池时,应该创建一次连接池。
这样的方法
let pool;
app.listen(port, async () => {
console.log(`Example app listening on port ${port}!`);
pool = await sql.connect("connectionstring");
});
在路线中,您基本上会像平常一样使用游泳池。
更合适的方法是创建一个dbOperation文件,该文件包含所有相关方法并在您的路由中使用它们。