node.js中mysql连接池的使用
发布于 3 年前 作者 billgacsli 25118 次浏览 来自 分享

起初的做法是创建一个连接然后使用,后来发现一段时间后会出现卡死不响应的情况,只有重启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  
});
11 回复

直接 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 QQ图片20170221100753.png 从源码来看的话,是不会新建实例的,但是在实际操作中,数据库的连接数却爆了。。

@CRAZYFAKE 没仔细看你的截图。

数据库连接满了会不会是你的进程数开得太多了?如果你怀疑是这个 require 语句导致的问题的话,那很容易重现一下的。写个 test 文件专门调用这个 loadClass 看看数据库的连接是否上涨

@alsotang 恩。非常感谢!

pool.getConnection((error, conn)=>{ conn.query() })

这种方式不推荐,除非特殊环境!刚踩过的坑啊

回到顶部