关于Nodejs链接mysql超时的问题
关于Nodejs链接mysql超时的问题
最近线上的进程总是自己挂掉,查看nohup.out文件,发现是mysql链接久了,超时自动关闭链接了,网上搜索了一些解决办法,可依然没有解决。求大神帮忙,谢啦!
<code>Error: Connection lost: The server closed the connection. </code>
下面是我的代码:
<pre>var mq = require(“mysql”);
global.mc = mq.createConnection({
host:“192.168.1.113”,
user: “root”,
password: “root”
});
var connectionState = false;
function connectMySql(){
mc.connect(function(err){
if(err){
console.log(‘SQL connect err:’+err);
connectionState = false;
}
else{
console.log(‘SQL connect successful!’);
connectionState = true;
}
});
mc.on(‘close’, function (err) {
logger.error(‘mysqldb conn close’);
connectionState = false;
});
mc.on(‘error’, function (err) {
logger.error('mysqldb error: ’ + err);
connectionState = false;
});
}
connectMySql();
var dbConnChecker = setInterval(function(){
if(!connectionState){
connectMySql();
}
},500);</pre>
针对你遇到的 Node.js 连接 MySQL 超时的问题,我们可以从几个方面来解决这个问题。首先,我们需要确保连接配置正确,并且在连接丢失后能够自动重连。
解决方案
-
配置
autoReconnect
选项:MySQL 驱动支持一个名为autoReconnect
的配置项,可以在连接对象中启用它。这将使得连接在断开后尝试自动重新连接。 -
设置连接超时时间:可以调整连接的超时时间,以适应你的应用需求。
-
错误处理和日志记录:确保错误被妥善处理,并且有适当的日志记录以便于调试。
示例代码
const mysql = require('mysql');
// 创建连接池,推荐使用连接池而不是单个连接
const pool = mysql.createPool({
host: '192.168.1.113',
user: 'root',
password: 'root',
database: 'your_database', // 添加数据库名称
connectionLimit: 10, // 最大连接数
waitForConnections: true, // 当无空闲连接时,等待新连接
queueLimit: 0, // 无限队列
acquireTimeout: 30000, // 获取连接的最大等待时间(毫秒)
idleTimeoutMillis: 30000, // 空闲连接的超时时间(毫秒)
connectionTimeout: 30000, // 连接建立的最大等待时间(毫秒)
multipleStatements: true, // 支持多语句执行
autoReconnect: true // 自动重连
});
// 检查连接状态并重新连接
function checkAndReconnect() {
pool.getConnection((err, connection) => {
if (err) {
console.error('Database connection failed: ' + err.stack);
return;
}
console.log('Connected as id ' + connection.threadId);
// 使用完连接后释放
connection.release();
// 设置定时器每分钟检查一次连接状态
setTimeout(checkAndReconnect, 60000);
});
}
// 初始连接
checkAndReconnect();
// 使用连接池进行查询
pool.query('SELECT * FROM your_table', (error, results, fields) => {
if (error) throw error;
console.log(results);
});
关键点解释
- 连接池:使用连接池而非单个连接可以更好地管理资源,避免频繁创建和销毁连接带来的性能损耗。
autoReconnect
:启用自动重连功能,当连接丢失时会尝试重新连接。waitForConnections
和queueLimit
:这些配置项用于控制连接池的行为,如等待新连接或拒绝新请求。- 错误处理:确保错误被捕获并记录,以便于排查问题。
通过以上改进,你应该能有效解决连接超时的问题,并提高应用的稳定性和可靠性。
用连接池来管理数据库连接吧 https://github.com/coopernurse/node-pool
你用的是这个吧,https://github.com/felixge/node-mysql 如果你用的是这个你可以看下他的例子, 不过我也是推荐你是用连接池。他的例子都还是比较详细的。
谢啦!
刚看了一下连接池的使用方法,感觉不错,就用它了!非常感谢
根据你描述的情况,MySQL 连接超时并断开连接的问题通常可以通过调整 MySQL 的配置以及 Node.js 中的连接配置来解决。你可以尝试以下几种方法:
1. 调整 MySQL 配置
在 MySQL 的配置文件 my.cnf
或 my.ini
中,可以设置一些参数以延长连接超时时间。例如:
[mysqld]
wait_timeout = 28800 # 设置为8小时
interactive_timeout = 28800 # 同样设置为8小时
2. 在 Node.js 中配置连接
你可以通过设置 connectTimeout
和 acquireTimeout
等选项来避免连接超时问题。以下是修改后的代码示例:
const mysql = require('mysql');
// 创建 MySQL 连接池
const pool = mysql.createPool({
host: '192.168.1.113',
user: 'root',
password: 'root',
database: 'your_database', // 添加数据库名称
connectTimeout: 60000, // 连接超时时间(毫秒)
acquireTimeout: 60000, // 获取连接超时时间(毫秒)
});
function query(sql, params) {
return new Promise((resolve, reject) => {
pool.query(sql, params, (err, results) => {
if (err) return reject(err);
resolve(results);
});
});
}
// 示例查询
query('SELECT * FROM your_table', [])
.then(results => console.log(results))
.catch(err => console.error(err));
3. 使用连接池
使用连接池可以更好地管理连接,并且避免频繁地创建和销毁连接。以上代码已经使用了连接池。
4. 定期检查连接状态
尽管已经在你的代码中实现了定期检查连接状态,但建议直接使用连接池来管理连接,这将简化代码并提高效率。
希望这些解决方案能帮助你解决问题。如果还有其他问题,请随时告知。