mysql连接丢失错误nodejs
Posted
技术标签:
【中文标题】mysql连接丢失错误nodejs【英文标题】:mysql connection lost error nodejs 【发布时间】:2018-02-25 20:43:48 【问题描述】:我正在使用以下代码将我的节点连接到 mysql,用于我在项目中使用的所有其余 API; 我已将此作为我所有查询请求的通用数据库连接文件。
var mysql = require('mysql');
var db_connect = (function ()
function db_connect()
mysqlConnConfig =
host: "localhost",
user: "username",
password: "password",
database: "db_name"
;
db_connect.prototype.unitOfWork = function (sql)
mysqlConn = mysql.createConnection(mysqlConnConfig);
try
sql(mysqlConn);
catch (ex)
console.error(ex);
finally
mysqlConn.end();
;
return db_connect;
)();
exports.db_connect = db_connect;
上面的代码工作正常,我将使用我的查询在我的所有 rest api 中使用下面的“sql”来执行,如下所示。
var query1 = "SELECT * FROM table1";
sql.query(query1,function(error,response)
if(error)
console.log(error);
else
console.log(response);
)
到目前为止一切都很好,但问题是我收到 sql 协议连接错误 在运行我的永久模块 8-12 小时后
forever start app.js
我正在使用上述永久模块开始我的项目。 8-12 小时后,我收到以下错误,我所有的其余 api 都无法正常工作或出现故障。
"stack": ["Error: Connection lost: The server closed the connection.", " at Protocol.end (/path/to/my/file/node_modules/mysql/lib/protocol/Protocol.js:109:13)", " at Socket.<anonymous> (/path/to/my/file/node_modules/mysql/lib/Connection.js:102:28)", " at emitNone (events.js:72:20)", " at Socket.emit (events.js:166:7)", " at endReadableNT (_stream_readable.js:913:12)", " at nextTickCallbackWith2Args (node.js:442:9)", " at process._tickDomainCallback (node.js:397:17)"],
"level": "error",
"message": "uncaughtException: Connection lost: The server closed the connection.",
"timestamp": "2017-09-13T21:22:25.271Z"
然后我在研究中得到了一个解决方案来配置手柄断开连接,如下所示。 但我正在努力使用我的代码配置我的 sql 连接,如下所示。
var db_config =
host: 'localhost',
user: 'root',
password: '',
database: 'example'
;
var connection;
function handleDisconnect()
connection = mysql.createConnection(db_config); // Recreate the connection, since
// the old one cannot be reused.
connection.connect(function(err) // The server is either down
if(err) // or restarting (takes a while sometimes).
console.log('error when connecting to db:', err);
setTimeout(handleDisconnect, 2000); // We introduce a delay before attempting to reconnect,
// to avoid a hot loop, and to allow our node script to
); // process asynchronous requests in the meantime.
// If you're also serving http, display a 503 error.
connection.on('error', function(err)
console.log('db error', err);
if(err.code === 'PROTOCOL_CONNECTION_LOST') // Connection to the MySQL server is usually
handleDisconnect(); // lost due to either server restart, or a
else // connnection idle timeout (the wait_timeout
throw err; // server variable configures this)
);
handleDisconnect();
谁能帮我用上面的代码修改我的代码?
【问题讨论】:
【参考方案1】:SHOW SESSION VARIABLES LIKE '%wait_timeout';
SHOW GLOBAL VARIABLES LIKE '%wait_timeout';
其中一个设置为 28800(8 小时)。增加它。
或者...捕获错误并重新连接。
或者...检查“连接池”在您的框架中是如何处理的。
但是...请注意可能会发生网络故障。因此,简单地增加超时不会处理此类故障。
或者...不要长时间挂在连接上。它玩得不好。 而且它可能导致超过max_connections
。
(抱歉,我不太了解您的应用程序,无法更具体地说明要追求的众多路径中的哪一个。)
最大连接数
...wait_timeout
和 max_connections
以笨拙的方式走到一起。如果超时“太高”,连接数会不断增长,从而威胁“连接太多”错误。在典型设计中,最好降低超时时间,以防止客户端浪费地挂在连接上太久。
如果您的情况是:“固定数量的客户端希望永远保持连接”,那么增加超时时间,但 不 max_connections
(至少不会超出固定数量的客户端)。
不过,如果网络出现问题,连接可能会中断。所以,你仍然可以得到“连接丢失”。 (但是,如果一切都在同一台机器上,这不太可能。)
【讨论】:
增加这些超时会产生任何其他错误吗? 你认为这会是我的问题的原因吗? 添加了关于 max_connections 的讨论 现在我已将超时时间增加到 1 年,并且每 5 秒查询一次我的数据库,并且此问题不再出现?这是一个好习惯吗? @Jagadeesh 我认为“每 5 秒查询一次我的数据库”就足够了,它充当心跳,MySQL 不会关闭连接,只需将 wait_timeout 保留为默认值即可;【参考方案2】:我已经通过使用池连接解决了这个问题。这样试试https://www.npmjs.com/package/mysql
var mysql = require('mysql');
var pool = mysql.createPool(...);
pool.getConnection(function(err, connection)
// Use the connection
connection.query('SELECT something FROM sometable', function (error, results, fields)
// And done with the connection.
connection.release();
// Handle error after the release.
if (error) throw error;
// Don't use the connection here, it has been returned to the pool.
);
);
【讨论】:
以上是关于mysql连接丢失错误nodejs的主要内容,如果未能解决你的问题,请参考以下文章
错误代码:2013。查询期间丢失与 MySQL 服务器的连接