目前使用node读取mysql中的数据,每次读取的时候都会pool.getConnection创建一个连接读取完数据再关闭下一次再重新打开, 问了下公司的后台不是写node的,说是要创建一个全局变量存储一个连接,每次操作直接用这个,如果连接失效了才会重新连接 求教下node下使用连接池的正确方式
//目前的代码是这样的
const mysql = require('promise-mysql');
const config = require('./config');
const pool = mysql.createPool({
host: config.host,
user: config.user,
password: config.password,
database: config.database,
connectionLimit: 10
});
//这是之前使用的方式每次创建一个连接使用完关闭
function getDataFromSqlQuery(sql) {
return new Promise((resolve, reject) => {
pool.getConnection().then((connection) => {
connection.query(sql).then(function (res) {
resolve(res);
pool.releaseConnection(connection);
return;
}).catch(err => {
reject(err);
});
})
});
}
//刚才尝试了下想直接把connection导出使用await函数接受,可还是做不到全局赋值只能在async函数中使用,使用完毕再关闭
function getConnection(sql) {
return new Promise((resolve, reject) => {
pool.getConnection().then((connection) => {
resolve(connection);
}).catch(err=>{
reject(err);
})
});
}
module.exports = {
pool : pool,
getConnection : getConnection,
getData:getDataFromSqlQuery
};
//调用
const sql = require('../modules/sql-connection.js');
router.post('/test', async function (next) {
let start = new Date();
let res = await sql.getData('select * from unsafeip limit 1');
console.log(`${new Date() - start} ms`);
this.body = res;
});
//测试服务器 阿里云北京服务器单核1G内存 坐标上海
//用for循环调用了下 不存在失败的情况
for (let i = 0, len = 10000; i < len; i++) {
(async function (i,start) {
try {
let res = await getDataFromSqlQuery('select * from unsafeip limit 1');
console.log(`${i} : ${new Date() - start} ms`);
}catch (e){
console.log(e);
console.log(`第${i}次请求失败`);
}
})(i+1,new Date())
}
//1000次的结果 : 6269 ms
/**最终结果 9991 : 63803 ms
9993 : 63803 ms
9996 : 63812 ms
9997 : 63838 ms
9998 : 63842 ms
9999 : 63849 ms
10000 : 63856 ms
*/
//创建一个连接一直用同一个
(async function () {
let connection =await getConnection();
for (let i = 0, len = 1000; i < len; i++) {
(async function (i,start) {
try {
let res = await connection.query('select * from unsafeip limit 1');
console.log(`${i} : ${new Date() - start} ms`);
}catch (e){
console.log(e);
console.log(`第${i}次请求失败`);
}
})(i,new Date())
}
})();
// 结果 999 : 30301 ms
//结果发现每次打开关闭比一直使用一个连接连接速度更快 不纠结这个问题了