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 的呢 ?
![]() | 1 unclemcz 2024-01-21 15:11:49 +08:00 via Android 我用 pool. query ,不考虑连接释放的问题。 |
![]() | 3 unclemcz 2024-01-22 08:18:33 +08:00 @gokiller 我用的 mysql 库是: https://www.npmjs.com/package/mysql 连接池部分可以查看这个部分: https://www.npmjs.com/package/mysql#pooling-connections pool.query=pool.getConnection + connection.query + connection.release |
![]() | 4 unclemcz 2024-01-22 08:58:46 +08:00 via Android |