1. 什么是数据库链接池?前端
数据库链接池是程序启动时创建足够的数据库链接,并将这些链接组成一个池,由程序动态地对池中的链接进行申请,使用和释放。java
2. 使用数据库链接池原理及优势是什么?node
数据库链接池在初始化时将会建立必定数量的数据库链接放到链接池中,链接池都将一直保证至少拥有这么多的链接数量,当有数据库须要被链接的时候,它会向数据库链接池申请资源和使用,使用完成后会释放到数据库链接池中。固然数据库链接池中拥有最小链接数量和最大链接数量,当数据库的链接超过链接池中最大的数量的时候,这些请求将被加入到等待队列中。mysql
其实他们的原理就比如咱们公司的招聘前端开发同样,当有A项目的时候,咱们公司须要招聘一个前端开发去作项目,可是当公司有B、C、D、等项目的时候,或者不少项目的时候须要不断的招聘前端开发,那么这样会给公司带来不少人力成本的。所以咱们须要一个前端主管来管理这些前端资源。前端主管手下假若有5个前端开发,那么当A、B、C、D、E、项目来的时候,前端主管会依次把这些项目分配给对应的开发人员去跟进。可是当还有F等项目的时候,由于F项目已经超过前端人员的时候,没有人再去支持这些个项目,所以这些项目须要排期,等A、B、C、D、E 其中任何一个开发完成后,上线了,而后这些开发人员就和数据库同样释放资源,返回到前端组来,而后前端主管再把F项目分配到对应的开发人员。这个比方就比如能够理解为一个数据库链接池了。而不是有n个项目须要招聘n个前端开发来作项目,那这样的缺点是公司的人力成本会大大的增长。因此数据库的连接池也是这个意思,当网站某一天有很大的流量的时候,数据库服务器须要为每次连接建立一次数据库连接。这样就很浪费数据库的资源,而且频繁的建立和关闭数据库的连接,很容易致使服务器内存溢出等状况发生。sql
链接池的做用是:数据库的链接池负责分配,管理和释放数据库连接的。它容许应用程序重复使用一个现有的数据库的连接。而不是从新建立一个。数据库
3. 传统的数据库连接和数据库链接池的运行机制有啥区别?服务器
传统的咱们通常来java来讲:java访问数据库的过程通常是以下:函数
1. 装载数据库驱动程序。
2. 经过JDBC创建数据库的连接。
3. 访问数据库,执行一些sql语句。
4. 断开及关闭数据库的连接。网站
如上是通常的java访问数据库连接的过程。ui
下面咱们使用数据库的链接池的操做过程以下:
1. 程序初始化时建立链接池。
2. 使用时向链接池申请可用的资源。
3. 使用完毕后,将数据库连接返回给链接池。
4. 程序退出时,断开全部的连接,并释放数据库的连接。
这就是传统和链接池的区别。
node + mysql 实现数据库链接池
在mysql模块中,咱们可使用 createPool方法来建立链接池,使用方法以下所示:
var pool = mysql.createPool(options);
options 参数是一个对象,该对象中有不少属性配置,该对象的做用是用于指定该链接池中连接的统一使用的各类选项。
常见的选项以下:
connectionLimit: 用于指定链接池中最大的连接数,默认属性值为10.
queueLimit: 用于指定容许挂起的最大链接数,若是挂起的链接数超过该数值,就会当即抛出一个错误,默认属性值为0.表明不容许被挂起的最大链接数。
在如上创建链接后,咱们可使用 getConnection 方法从链接池中获取一个链接。该方法使用以下所示:
pool.getConnection(callback);
getConnection 方法调用后,它有一个参数callback回调函数,该回调函数也有二个参数,以下所示:
function(err, connection) { }
err: 该参数是指操做失败时的错误对象。
connection: 该值为一个对象,表明获取到的链接对象。当链接失败时,该值为undefined。
当链接不须要使用的时候,咱们可使用该链接对象的 release 方法来归还到链接池中。该方法使用以下:
connection.release();
当链接不须要使用且须要从链接池中移除的时候,咱们可使用destory方法,该方法使用以下所示:
connection.destory();
当链接不须要使用的时候,咱们能够关闭该链接,使用方法以下:
pool.end();
下面咱们来作一个使用数据库链接池作一个demo以下所示:
const mysql = require('mysql'); // 建立一个数据库链接池 const pool = mysql.createPool({ host: 'localhost', port: 3306, database: 'my_db', user: 'root', password: '123456' }); // 从链接池中获取一个链接 pool.getConnection((err, conn) => { if (err) { console.log('和mysql数据库创建链接失败'); } else { console.log('和mysql数据库链接成功'); conn.query('select * from user', (err2, res) => { if (err2) { console.log('查询数据库失败'); } else { console.log(res); pool.end(); } }) } });
以下图所示: