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

242 天前
 gokiller
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 的呢 ?

1138 次点击
所在节点    程序员
4 条回复
unclemcz
242 天前
我用 pool. query ,不考虑连接释放的问题。
gokiller
242 天前
@unclemcz query 如果后续要复用这个 connection ,是又要重新 connect 吗?
unclemcz
241 天前
@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
241 天前

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1010422

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX