繁体   English   中英

什么时候使用 node-mysql 关闭 MySQL 连接?

[英]When to close MySQL connection using node-mysql?

目前使用: https://github.com/felixge/node-mysql

我有以下代码:

var connection = mysql.createConnection({
    host     : 'localhost',
    user     : 'me',
    password : 'secret',
    database : 'Database1'
});
app.put('/api/upload', function(req, res, next)
{
    connection.connect();
    doMultipleQueries(function(err)
    {
        connection.end();
    });          
};

put 请求工作得很好,但第二次调用它时,出现以下错误

events.js:68
        throw arguments[1]; // Unhandled 'error' event
                       ^
Error: Cannot enqueue Handshake after invoking quit.
    at Protocol._validateEnqueue (/Users/anon/Desktop/project Web/node_modules/mysql/lib/protocol/Protocol.js:110:16)

我应该让连接保持打开状态直到服务器死机吗?

更新:当我将mysql.createConnection移动到放置请求 function 时,如下所示:

var connection = null; 
app.put('/api/upload', function(req, res, next)
{
    connection = mysql.createConnection({
        host     : 'localhost',
        user     : 'me',
        password : 'secret',
        database : 'Database1'
    });
    connection.connect();
    doMultipleQueries(function(err)
    {
        connection.end();
    });          
};

它工作正常。 这是否意味着connection.end()关闭了mysql.createConnection创建的内容并且无法重新连接?

当前正在使用: https : //github.com/felixge/node-mysql

我有以下代码:

var connection = mysql.createConnection({
    host     : 'localhost',
    user     : 'me',
    password : 'secret',
    database : 'Database1'
});
app.put('/api/upload', function(req, res, next)
{
    connection.connect();
    doMultipleQueries(function(err)
    {
        connection.end();
    });          
};

放置请求工作正常,但是第二次调用它,出现以下错误

events.js:68
        throw arguments[1]; // Unhandled 'error' event
                       ^
Error: Cannot enqueue Handshake after invoking quit.
    at Protocol._validateEnqueue (/Users/anon/Desktop/project Web/node_modules/mysql/lib/protocol/Protocol.js:110:16)

我应该一直保持连接打开直到服务器死机吗?

更新:当我将mysql.createConnection移到put请求函数中时,如下所示:

var connection = null; 
app.put('/api/upload', function(req, res, next)
{
    connection = mysql.createConnection({
        host     : 'localhost',
        user     : 'me',
        password : 'secret',
        database : 'Database1'
    });
    connection.connect();
    doMultipleQueries(function(err)
    {
        connection.end();
    });          
};

它工作正常。 这是否意味着connection.end()关闭了mysql.createConnection创建的内容,并且无法重新连接?

当前正在使用: https : //github.com/felixge/node-mysql

我有以下代码:

var connection = mysql.createConnection({
    host     : 'localhost',
    user     : 'me',
    password : 'secret',
    database : 'Database1'
});
app.put('/api/upload', function(req, res, next)
{
    connection.connect();
    doMultipleQueries(function(err)
    {
        connection.end();
    });          
};

放置请求工作正常,但是第二次调用它,出现以下错误

events.js:68
        throw arguments[1]; // Unhandled 'error' event
                       ^
Error: Cannot enqueue Handshake after invoking quit.
    at Protocol._validateEnqueue (/Users/anon/Desktop/project Web/node_modules/mysql/lib/protocol/Protocol.js:110:16)

我应该一直保持连接打开直到服务器死机吗?

更新:当我将mysql.createConnection移到put请求函数中时,如下所示:

var connection = null; 
app.put('/api/upload', function(req, res, next)
{
    connection = mysql.createConnection({
        host     : 'localhost',
        user     : 'me',
        password : 'secret',
        database : 'Database1'
    });
    connection.connect();
    doMultipleQueries(function(err)
    {
        connection.end();
    });          
};

它工作正常。 这是否意味着connection.end()关闭了mysql.createConnection创建的内容,并且无法重新连接?

该模块不是一个一个地创建和管理连接,而是使用 mysql.createPool(config) 提供内置的连接池。 阅读有关连接池的更多信息。

创建一个池并直接使用它:

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

pool.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
  if (error) throw error;
  console.log('The solution is: ', results[0].solution);
});

这是 pool.getConnection() -> connection.query() -> connection.release() 代码流的快捷方式。 使用 pool.getConnection() 可用于共享连接 state 以进行后续查询。 这是因为对 pool.query() 的两次调用可能使用两个不同的连接并并行运行。 这是基本结构:

var mysql = require('mysql');
var pool  = mysql.createPool(...);

pool.getConnection(function(err, connection) {
  if (err) throw err; // not connected!

  // Use the connection
  connection.query('SELECT something FROM sometable', function (error, results, fields) {
    // When done with the connection, release it.
    connection.release();

    // Handle error after the release.
    if (error) throw error;

    // Don't use the connection here, it has been returned to the pool.
  });
});

如果您想关闭连接并将其从池中删除,请改用 connection.destroy()。 下次需要时,池将创建一个新连接。

连接是由池延迟创建的。 如果您将池配置为最多允许 100 个连接,但只同时使用 5 个,则只会建立 5 个连接。 连接也是循环的循环方式,连接从池的顶部取出并返回到底部。 按照这个https://github.com/mysqljs/mysql/blob/master/Readme.md#server-disconnects当从池中检索到以前的连接时,会向服务器发送一个 ping 数据包以检查连接是否仍然存在好的。

否则,请尝试以下代码

const mysql = require("mysql");

var connection;
function handleDisconnect() {
    connection = connection = mysql.createPool({
        host: "localhost",
        user: "xyz",
        password: "xyz",
        database: "xyz",
        multipleStatements: true,
        waitForConnections: true,
        connectionLimit: 100,
    });
    connection.getConnection(function (err) {
        if (err) {
            console.log('error when connecting to db:', err);
            setTimeout(handleDisconnect, 2000);
        }
    });
    connection.on('error', function (err) {
        console.log('db error', err);
        if (err.code === 'PROTOCOL_CONNECTION_LOST') {
            handleDisconnect();
        } else {
            throw err;
        }
    });
}

handleDisconnect();

module.exports = connection;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM