前言
对于为什么要使用连接池,说白了就是降低系统开销,当我们在频繁创建和销毁的时候就会产生非常大的系统开销。
在我们平时使用时,没什么感觉,都是自己一个人用,系统开销非常小,但是当成百上千人在使用呢?而连接池的作用就是限制我们进行频繁的创建和销毁,使每次的访问都是之前已经创建好的,即重复利用。
好处:
1.可以不必为建立连接和释放连接消耗更多的响应时间,一个连接在高并发下可以被高度重用。
2.有队列机制,当池子中连接都用完了,其他请求在排队时,有一些紧急的任务需要插队,我们可以很方便的做到这点
安装方式
$ npm install generic-pool@3.8.2
创建
pool
,在对应字段填写对应mysql
的ip
,port
,user
,password
等信息
由于我使用的是MySQL
数据库,所以就以MySQL
为主,使用别的数据库,这个支持的数据库还是挺多的,具体查看官网吧。
// dao-pool.js
let genericPool = require('generic-pool');
let mysql = require('mysql');
let DEFAULT_MIN_POOL_SIZE = 5; // 最少
let DEFAULT_MAX_POOL_SIZE = 20; // 最多
let DEFAULT_IDLE_TIMEOUT_IN_MILLIS = 30 * 1000; //毫秒
/*
* 创建mysql连接池
*/
module.exports = function () {
return genericPool.createPool({
name: 'mysql',
create: function () {
let client = mysql.createConnection({
host: '127.0.1',
port: '3306',
user: 'root',
password: '123456',
database: 'db1',
charset: 'utf8mb4',
multipleStatements: true,
});
// 测试连接用
// client.connect();
return client;
},
destroy: function (client) {
client.destroy();
}
},{
max: DEFAULT_MAX_POOL_SIZE,
min: DEFAULT_MIN_POOL_SIZE,
idleTimeoutMillis: DEFAULT_IDLE_TIMEOUT_IN_MILLIS,
priorityRange: 3,
log: false
});
};
MySql
对pool
的封装使用
query
回调函数的方式,这是平常使用的一种基础方式promiseQuery
异步Promise
的使用方式,新手可以忽略,使用上面的就可以了。
// mysql.js
let sqlclient = module.exports;
let _pool;
let NND = {};
NND.init = function(){
_pool = require('./dao-pool')();
};
/**
* 获取mysql client并执行对应mysql命令
*/
NND.query = function(sql, args, cb){
_pool.acquire().then(function (client){
client.query(sql, args, function (err, res) {
_pool.release(client);
cb && cb(err, res);
});
}).catch(function (err) {
cb && cb(err);
});
};
/**
* promise 异步查询
*/
NND.promiseQuery = function (sql, args) {
return new Promise(function (resolve) {
NND.query(sql, args, function (err, res) {
if (!!err){
console.error("promiseQuery err:", err.message);
resolve(null);
} else {
resolve(res);
}
});
});
};
/**
* 销毁连接池
*/
NND.shutdown = function(){
_pool.drain().then(function () {
_pool.clear();
});
};
// 初始化
sqlclient.init = function() {
if (!!_pool){
return sqlclient;
} else {
NND.init();
sqlclient.query = NND.query;
sqlclient.promiseQuery = NND.promiseQuery;
return sqlclient;
}
};
// 关闭连接
sqlclient.shutdown = function() {
NND.shutdown();
};
结束
大致使用方式,就是这样,做个记录方便自己以后使用,具体使用情况可以根据自己情况修改。