如何在每次使用express请求后关闭mysql连接?

e4yzc0pl  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(501)

我有这样一个路由器文件:

  1. import express from 'express';
  2. import health from './health';
  3. import surface from './surface';
  4. const router = express.Router();
  5. router.use('/health', health);
  6. router.use('/surface', surface);
  7. router.get('*', (req, res) => {
  8. res.status(404);
  9. res.json({
  10. message: 'Uknown API endpoint'
  11. });
  12. });
  13. export default router;

在每条路线中,我都使用npm mysql 包来创建连接,然后在我调用 res.send() . iirc创建一个连接并在每个查询中结束它将是一个坏主意。
我试过这样做:

  1. router.use((req, res, next) => {
  2. next();
  3. mySingletonWrappingMysql.connection.end();
  4. });

考虑到我的路由是异步的 endConnection 电话打得太早了。 next 不是真正的异步所以我不能 await next 我甚至不确定这是否是正确的方式/地点。这个例子使用的是单例,因为我也不确定如何正确地设置一个新示例以在路由中使用。 req.param 似乎是一个不是最佳的选项,因为似乎是为特殊查询参数变量。

qmelpv7a

qmelpv7a1#

你需要一个连接到mysql的连接池。这是一个串行可重用连接资源池。你需要的时候就拿一个,做完了就放手。因此,每个请求,甚至每个中间件调用,都可以使用一个连接,而不必担心并发性(这对连接不起作用)。看看这个。https://www.npmjs.com/package/mysql#pooling-连接
像这样设置你的游泳池,就一次。每个node.js服务器示例需要为其使用的每个单独的mysql服务器提供一个池。

  1. var mysql = require('mysql');
  2. var pool = mysql.createPool({
  3. connectionLimit : 10,
  4. host : 'example.org',
  5. user : 'bob',
  6. password : 'secret',
  7. database : 'my_db'
  8. });

这个createpool操作创建一个最多有十个连接的池。每次使用该池时,它都会检查其所有连接是否繁忙。如果没有,它给你一个空闲的使用。如果他们都很忙,就会打开一个新的。但是,如果游泳池已经 connectionLimit 连接正在使用中,它将等待一个空闲的连接。
然后随意的一次性查询就是这样工作的。在rest服务器中,您可能会发现一些get查询可以通过对数据库的单个查询来满足。这些非常简单。不需要显式地从池中获取或释放连接。而且,当您释放连接时,它将保持与dbms的连接,以供将来的请求使用。如果满足一个特定的请求需要两到三个select查询,您也可以使用这种技术。但是,每个查询可能使用与池不同的连接。

  1. pool.query('SELECT whatever FROM whatever',
  2. function (error, results, fields) {
  3. if (error) throw error;
  4. /* handle your results array */
  5. })

如果您需要为多个查询获取一个连接,这几乎一样简单,但是您需要记住 release() 连接完成后。当某些查询依赖于序列中先前查询的结果时,需要这样做。

  1. pool.getConnection(function(err, connection) {
  2. if (error) throw error;
  3. connection.query('INSERT INTO sometable ...',
  4. function (error, results, fields) {
  5. if (error) {
  6. connection.release();
  7. throw error;
  8. }
  9. connection.query('INSERT INTO detail ... (LAST_INSERT_ID()...)',
  10. function (error, results, fields) {
  11. connection.release();
  12. if (error) throw error;
  13. });
  14. });
  15. });

您可能希望改用承诺,以避免这种函数嵌套,特别是如果您希望运行一系列查询的话。

展开查看全部

相关问题