起初的做法是创建一个连接然后使用,后来发现一段时间后会出现卡死不响应的情况,只有重启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 有什么问题啊?