V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gokiller
V2EX  ›  程序员

node.js express 等框架下如何查看是那个 api 没有 release connection 的?

  •  
  •   gokiller · 305 天前 · 1188 次点击
    这是一个创建于 305 天前的主题,其中的信息可能已经有所发展或是发生改变。
    app.get("/", (req, res) => {
      pool.getConnection(function (err, connection) {
        if (err) {
          console.log("err");
          console.log(err);
          connection.release();s
          return res.status(500).json({ msg: "err", data: err });
        }
    
    
        try {
      	const query = 'SELECT * FROM sales_salesorder WHERE set_invalid = 0 limit 1';
          connection.query(query, async function (err, result) {
            console.log("in connection");
            const result2 = await axios.get("https://qq.com/");
            console.log(connection.state);
    
            connection.query(
              "SELECT * FROM sales_salesorder limit 1",
              function (err, result) {
              
                console.log("Done");
    
                return res.status(200).json({ msg: "Done", data: JSON.stringify(result) });
              }
            );
          });
        } catch (err) {
          console.log(err);
          return res.status(400).json({ msg: "Failed", data: err });
        } finally {
          connection.release();
          console.log("out connection");
        }
      });
      
    

    问题 1: 在 try-- finally 里面, 由于 connection 是同步回调,所以第一次 connection 的 query 之后就会到 finally ,connection 被 release 了。

    程序打印: out connection in connection

    实际这个看来好像问题不大,connection release 释放之后,是 connection 的状态是 authenticated , 不过经过测试,实际 release 之后也是可以继续正常 query 数据

    但如果没有 finally 的 release 的释放连接,那么可能请求 100 次左右,该 api 就无法连接了。

    当然上面只是举例子,可以通过改成 await 的方式同步等待 query 之后再 release 。

    但如果系统太多这种语句,有没什么办法可以检测出来哪些 api 是没有正常 release 的呢 ?

    unclemcz
        1
    unclemcz  
       305 天前 via Android
    我用 pool. query ,不考虑连接释放的问题。
    gokiller
        2
    gokiller  
    OP
       305 天前
    @unclemcz query 如果后续要复用这个 connection ,是又要重新 connect 吗?
    unclemcz
        3
    unclemcz  
       304 天前
    @gokiller
    我用的 mysql 库是: https://www.npmjs.com/package/mysql
    连接池部分可以查看这个部分: https://www.npmjs.com/package/mysql#pooling-connections
    pool.query=pool.getConnection + connection.query + connection.release
    unclemcz
        4
    unclemcz  
       304 天前 via Android
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2526 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:42 · PVG 23:42 · LAX 07:42 · JFK 10:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.