首页 > 解决方案 > 节点 mssql 并发请求导致“连接已关闭”

问题描述

我正在使用节点 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);
});

标签: node.jssql-servertediousjs

解决方案


我不会为每个请求创建池并在每个请求中关闭它。这是非常低效的。您应该在启动服务器并重用它时创建一次连接池。

像这样的方法

let pool;

app.listen(port, async () => {
   console.log(`Example app listening on port ${port}!`);
pool = await sql.connect("connectionstring");
});

在您的路线中,您基本上按照您通常的方式使用池。

更合适的方法是创建一个包含所有相关方法的 dbOperation 文件并在您的路线中使用它们。


推荐阅读