节点mssql并发请求导致“连接已关闭”

时间:2020-01-29 17:59:44

标签: node.js sql-server tediousjs

我正在使用节点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 个答案:

答案 0 :(得分:1)

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

这样的方法

let pool;

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

在路线中,您基本上会像平常一样使用游泳池。

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

相关问题