节点 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 并发请求导致“连接已关闭”的主要内容,如果未能解决你的问题,请参考以下文章

SqlServer SQLException 该连接已关闭

SqlServer SQLException 该连接已关闭

413 请求实体太大 + Web 服务器连接已关闭 |错误 64

https 请求:底层连接已关闭:无法为 SSL/TLS 安全通道建立信任关系

WebException:底层连接已关闭

错误:C# 底层连接已关闭:无法为 SSL/TLS 安全通道建立信任关系