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(); } }) } });
以下圖所示: