节点 mssql 并发请求导致“连接已关闭”
Posted
技术标签:
【中文标题】节点 mssql 并发请求导致“连接已关闭”【英文标题】:node mssql concurrent request resulting "Connection is closed" 【发布时间】:2020-05-15 07:12:39 【问题描述】:我正在使用节点 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);
);
【问题讨论】:
猜测是因为你关闭连接池的时候一个成功,然后另一个失败。 【参考方案1】:我不会为每个请求创建池并在每个请求时关闭它。这是非常低效的。您应该在启动服务器时创建一次连接池并重复使用它。
这样的方法
let pool;
app.listen(port, async () =>
console.log(`Example app listening on port $port!`);
pool = await sql.connect("connectionstring");
);
在您的路线中,您基本上按照平常的方式使用池。
更合适的方法是创建一个包含所有相关方法的 dbOperation 文件并在您的路由中使用它们。
【讨论】:
以上是关于节点 mssql 并发请求导致“连接已关闭”的主要内容,如果未能解决你的问题,请参考以下文章
413 请求实体太大 + Web 服务器连接已关闭 |错误 64