起初的做法是创建一个连接然后使用,后来发现一段时间后会出现卡死不响应的情况,只有重启nodejs服务,搜索一番后想到了用连接池,经测试,不再出现卡死不响应情况。
参考链接: https://www.npmjs.com/package/mysql http://blog.csdn.net/lovingshu/article/details/41721233
Node.js mysql连接池模块
1,安装node的mysql模块 npm -install -g node-mysql
2,建立一个类库,就叫mysql_pool.js吧,然后内容如下:
var mysql=require("mysql");  
var pool = mysql.createPool({  
    host: 'localhost',  
    user: 'user',  
    password: 'password',  
    database: 'database',  
    port: port  
});  
  
var query=function(sql,options,callback){  
    pool.getConnection(function(err,conn){  
        if(err){  
            callback(err,null,null);  
        }else{  
            conn.query(sql,options,function(err,results,fields){  
                //释放连接  
                conn.release();  
                //事件驱动回调  
                callback(err,results,fields);  
            });  
        }  
    });  
};  
  
module.exports=query;  
3,在js类使用如下
var query=require("./lib/mysql_pool");  
  
query("select * from table where id=?", [1], function(err,results,fields){  
    //do something  
});
直接 pool.query 就可以自动获取回收啦。♻️   ♻
@alsotang 试了下,直接pool.query是可以,请问下这两者有啥区别?我看官方例子两种方式都有,有什么不同的适用场景吗?谢谢
这有个哥们遇到了需要使用pool.getConnection而不能使用pool.query的情况。
pool.getConnection获取到的connection在其回调函数中是一致的,可以保证系列查询在同一个connection上依次串行执行;pool.query每次调用则可能在不同的connection上执行查询。
其实还是没太明白咋回事,应该一般情况用pool.query完全能满足要求了。
https://github.com/mysqljs/mysql/issues/857#issuecomment-47382419
不同的connection事务会有问题吧
@billgacsli @DevinXian 直接用 pool.query 每次都随机分配 connection。当有些操作需要保证是同一 connection 的时候,就独立使用 pool.getConnection吧
@alsotang 像这种以模块的形式导出,每次require("./lib/mysqlpool")的时候,会不会新建这个连接池实例呢?
@alsotang 
从源码来看的话,是不会新建实例的,但是在实际操作中,数据库的连接数却爆了。。
@CRAZYFAKE 没仔细看你的截图。
数据库连接满了会不会是你的进程数开得太多了?如果你怀疑是这个 require 语句导致的问题的话,那很容易重现一下的。写个 test 文件专门调用这个 loadClass 看看数据库的连接是否上涨
@alsotang 恩。非常感谢!
pool.getConnection((error, conn)=>{ conn.query() })
这种方式不推荐,除非特殊环境!刚踩过的坑啊
@Robert-lihouyi 有什么问题啊?