nodejs解决mysql和连接池(pool)自动断开问题
最近在做一个个人项目,数据库尝试使用了mongodb、sqlite和mysql。分享一下关于mysql的连接池用法。项目部署于appfog,项目中我使用连接池链接数据库,本地测试一切正常。上线以后,经过几次请求两个数据接口总是报503。一直不明就里,今天经过一番排查终于顺利解决了。
1.mysql 链接普通模式
- var mysql = require(‘mysql’),
- env = {
- host : ‘localhost’,
- user : ‘root’,
- password : ‘2212’,
- database : ‘image_marker’
- };
- db = mysql.createConnection(env);
- db.connect();
- exports.do = function (sql, callback) {
- db.query(sql, callback);
- }
MySQL中有一个名叫wait_timeout的变量,表示操作超时时间,当连接超过一定时间没有活动后,会自动关闭该连接,这个值默认为28800(即8小时)。对于这种普通连接的方式,在正式线上可能会遇到连接丢失的问题(No reconnection after connection lost错误日志),上github上看了下文档和issues,上面说到连接丢失后不会自动重新连接,会触发error事件。 所以可以使用下面这种方法来避免连接对视问题:
- function handleError (err) {
- if (err) {
- // 如果是连接断开,自动重新连接
- if (err.code === ‘PROTOCOL_CONNECTION_LOST’) {
- connect();
- } else {
- console.error(err.stack || err);
- }
- }
- }
- // 连接数据库
- function connect () {
- db = mysql.createConnection(config);
- db.connect(handleError);
- db.on(‘error’, handleError);
- }
- var db;
- connect();
2.使用连接池
对于丢失连接的问题,可以使用连接池(最新版mysql模块,用mysql.createPool()来创建的pool,当触发了connection的error事件时,会把该connection对象从连接池中移除。)
- var mysql = require(‘mysql’);
- var pool = mysql.createPool(config);
- pool.getConnection(function(err, connection) {
- // Use the connection
- connection.query( ‘SELECT something FROM sometable’, function(err, rows) {
- // And done with the connection.
- connection.end();
- // Don’t use the connection here, it has been returned to the pool.
- });
- });
参考:https://cnodejs.org/topic/51cd3bcc73c638f3705998f5
使用了连接池后,有网友说每一次请求都用pool创建一个connection,改进我的代码如下连接:
http://www.2cto.com/kf/201404/292016.html
转载