【问题标题】:When to close MySQL connection using node-mysql?何时使用 node-mysql 关闭 MySQL 连接?
【发布时间】:2021-07-02 07:17:09
【问题描述】:

当前使用: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 移动到 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 创建的内容并且无法重新连接?

【问题讨论】:

    标签: javascript mysql node.js


    【解决方案1】:

    connection.end() 不管致命错误,它都能正常工作。如果在发送COM_QUIT 数据包之前发生致命错误,则会向回调提供err 参数,但无论如何都会终止连接。

    同时检查destroy() method。这将导致底层套接字立即终止。

    您可以添加错误处理程序。

    https://github.com/felixge/node-mysql/blob/master/Readme.md#error-handling

    // I am Chuck Norris:
    connection.on('error', function() {});
    

    一旦终止,现有的连接对象就不能按设计重新连接。

    检查这里。它显示断开后重新连接。

    https://github.com/felixge/node-mysql/blob/master/Readme.md#server-disconnects

    【讨论】:

    • 感谢您的回答,但这对我帮助不大。实际上,我确实有用于 connection.on 错误的代码,它显示了上面显示的错误。 end() 正确关闭连接,但是当我尝试重新连接时,它没有连接。
    • 我不是 GitHub 用户,所以也许你(某人)可以很容易地告诉这些人,只需在“connection.on”中传递的函数末尾添加一个右花括号。谢谢
    【解决方案2】:

    我认为正确的方法是在启动时为您的应用获取连接,并在您的应用关闭时获取end()

    【讨论】:

    • 可能效率不高,因为一个连接可能会在复杂查询期间停止。
    • 如果您期望长查询,请使用连接池(这是池背后的想法,即已经有一个连接,可以使用),或者确保您的查询已正确优化。 node-mysql 还可以让你处理断开连接和其他错误。
    • 长查询是什么意思?超过 10 个连接?
    • @G4BB3R 长查询 => 耗时长(例如耗时>100ms)
    • 不不不。使用 NoSQL(例如 Mongo)是正确的,但 sql 连接有限制。如果您的限制为 15(默认为 10 或 15),这意味着您的站点上任何时候只能有 15 人。完成您需要做的事情后,您应该关闭连接。
    猜你喜欢
    • 1970-01-01
    • 2021-12-01
    • 2014-08-17
    • 2021-09-26
    • 1970-01-01
    • 2019-11-15
    • 2016-08-08
    • 2016-04-04
    • 2011-09-30
    相关资源
    最近更新 更多