关闭 MySQL Node.js 连接

8

我正在使用ExpressJS和MySQL来开发Node应用程序。我正在使用这个模块https://github.com/felixge/node-mysql/,并且正在学习其使用方法。我遇到的困难是如何正确地关闭连接。

这是我的做法:

app.post('/example', function (req, res) {

    //BD
    var connection = mysql.createConnection({
        host: config.database.host,
        port: config.database.port,
        user: config.database.user,
        password: config.database.password,
        database: config.database.database
    });

    var sql = '';

    if (varExample != null) {

         sql = 'Random query';

         connection.query(sql, function (err, results) {

             //Get results

             connection.end();
         }); 
    }
});

有时我需要多次调用这个方法来在数据库中插入数据。此时我会遇到“连接过多”的错误。在这种情况下应该如何关闭连接呢?
2个回答

9

不应该在每次收到请求时都打开一个连接,因为每次连接都很慢。其次,驱动程序通常会为您打开一组连接池,因此不应该成为问题。无需关闭与MySQL的连接。

基本上,您需要这样做:

//BD
var connection = mysql.createConnection({
    host: config.database.host,
    port: config.database.port,
    user: config.database.user,
    password: config.database.password,
    database: config.database.database
});
app.post('/example', function (req, res) {
    var sql = '';

    if (varExample != null) {

         sql = 'Random query';

         connection.query(sql, function (err, results) {

            //Get results
         });  
    }
});

编辑:添加池选项。 拥有连接池是大多数需要处理多个查询的服务器所需的基本功能,这只是稍微改变了创建连接的方式。

var connection  = mysql.createPool({
  connectionLimit : 10,
  host            : 'example.org',
  user            : 'bob',
  password        : 'secret'
});

这个解决方案有问题。如果我重复使用相同的连接来进行不同的查询,Node 会回答“无法在调用 quit 后排队查询”。 - Ulyarez
抱歉,您必须删除 connection.end() - DevAlien
也许这是一个愚蠢的问题,但是 Node 是如何在请求后关闭连接的呢? - Ulyarez
1
为什么你必须关闭连接?驱动程序创建了一组连接池,它们已经准备好被使用...当你不再需要使用它时,你就会关闭这些连接。但是作为一个Node服务器,我猜它将长时间运行,而且我也猜你会更多次地使用MySQL,所以你可以保持连接处于打开状态。 - DevAlien
@DevAlien 驱动程序默认不会创建连接池。请查看我的答案以创建数据库池。设置与您此处的设置略有不同。 - tier1
@tier1 哦,是的,我认为是正确的行为,但显然不是(我不理解这个选择,因为几乎每个人都想要一个池)。我也会更新这个答案,因为它被标记了。我会放两个版本。 - DevAlien

7
我知道已经有一个被接受的答案了,但你真正应该做的是创建一个数据库池,其他答案并没有给出示例。你必须以不同于使用该库创建普通数据库连接的方式设置它。
-编辑 你不必担心关闭连接。
    var mysql = require('mysql');
    var pool  = mysql.createPool({
      connectionLimit : 10,
      host            : 'example.org',
      user            : 'bob',
      password        : 'secret'
    });

    pool.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
      if (err) throw err;

      console.log('The solution is: ', rows[0].solution);
    });

exports.Pool = pool;

不关闭的问题在于,如果从批处理中运行,则节点永远不会退出。那么我们如何实现有序终止呢? - mckenzm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接