引言
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能——来自百度百科
数据库连接的开销是昂贵的,处理不好连接的话,太多的连接会导致数据查询缓慢,超时等情况。而利用数据库连接池,我们可以很好的管理和复用已存在的连接,从而达到节省资源,提高程序性能。
如何使用连接池
安装
在node端连接数据库,一般使用mysql库,安装如下:
$ npm install mysql -S
单次连接
安装完之后,看官方给的例子如何连接数据库:
- 创建连接
- 打开连接
- 查询
- 关闭连接 ```javascript var mysql = require(‘mysql’); var connection = mysql.createConnection({ host : ‘localhost’, user : ‘me’, password : ‘secret’, database : ‘my_db’ });
connection.connect();
connection.query(‘SELECT 1 + 1 AS solution’, function (error, results, fields) { if (error) throw error; console.log(‘The solution is: ‘, results[0].solution); });
connection.end();
这种操作方式每次查询都要创建一个连接,如果并发大的话,就会创建很多个连接,从而导致性能下降。<a name="CTsNW"></a>## 使用连接池我试试使用连接池来连接,并封装成Promise:```javascriptvar mysql = require('mysql');// 创建 mysql 连接池资源var pool = mysql.createPool({host : 'localhost',user : 'me',password : 'secret',database : 'my_db'acquireTimeout: 15000, // 连接超时时间connectionLimit: 100, // 最大连接数waitForConnections: true, // 超过最大连接时排队queueLimit: 0, // 排队最大数量(0 代表不做限制)});exports.query = function(sql, values) {new Promise(function(resolve, reject){//建立链接pool.getConnection(function(err, connection) {if (err) {return reject(err); // not connected!}connection.query(sql, values, function(error, results) {//将链接返回到连接池中,准备由其他人重复使用connection.release();if (error){return reject(error);}resolve(results);});});});};
连接参数说明
- acquireTimeout: 表示连接超时时间,默认是10000 ms;最大连接数越大,连接时间越长。建议设置 15000ms
- connectionLimit: 最大连接数, 默认是 10; 并发操作较大时,连接数越大, 执行速度较快。经测试, 20000 并发执行数据库查询操作, 最大连接数为 10时, 响应时长 14508ms; 最大连接数设置50, 300等,响应时长接近 11000ms。所以,建议最大连接数设置100。
- waitforConnections:超过最大连接数是否等待。默认是等待,若设置成false,则超过最大连接数就报错。建议设置为true。
- queueLimit:排队最大数量。默认为无限制,0 代表无限制。建议设置为 0。
连接数相关查询
查询最大连接数
show global variables like ‘%max_connections%’;
设置最大连接数
set global max_connections=1000;
响应的最大连接数
show global status like ‘Max_used_connections’;
查看线程信息
show status like ‘Threads%’
睡眠连接超时数
show global variables like ‘wait_timeout’;
杀死连接id (表: INFORMATION_SCHEMA.PROCESSLIST)
kill 21120003
