之前写过一个监控mysql数据库更新状态的预警程序,总是莫名其妙的报一个连接错误的错,然后程序死掉。后来在系统趋于稳定之后,我就没再继续维护这个工具了。
但是最近我在写另一个工具时,遇到了一个奇怪的问题,就是:tick总在27000多左右的时候崩溃。
我进行了一系列的猜测,比如tick的代码,或者是逻辑有问题,最后我把思路放在了之前遇到的这个错误上。查阅资料后发现,MySQL数据库在连接之后,如果超过一个设定的时间戳之后,会断开。这个值叫WAIT_TIMEOUT,默认值是28800,也就是说如果连上MySQL数据库之后,8小时内没有进行操作,这个连接便会断开。
网上很多连接MySQL数据库的代码没有处理过超时连接的问题,就连JS的官方代码好像也是在17年之后才更新的。以往这个问题,大家都是通过修改这个值来进行规避的。比如改成300天。修改有两种方式,一种是修改配置文件,这样在启动时便会使用这个配置;另一种是修改这个值,或者全局,或者当次生效。
下面是我在使用JavaScript语言链接MySQL数据库时,处理超时重连问题的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| this.config = { "host": "x.x.x.x", "port": xxxx, "user": "root", "password": "pass", "database": "name"" }
async connect() { let self = this; console.log("connect mysql success with", JSON.stringify(this.config)) // 创建连接 this.db_mysql = mysql.createConnection( this.config ); // 连接数据库 await this.db_mysql.connect(); // 错误处理 this.db_mysql.on('error', function(err) { if (err) { if (err.code === 'PROTOCOL_CONNECTION_LOST') { // 处理超时 console.warning("start reconnect mysql"); self.connect(); } else { console.error(err.stack || err); console.warning("start reconnect mysql"); self.connect(); } } }); }
|
最后更新时间:
梦想依在 人生正当年