node+mysql 數據庫連接池


1. 什么是數據庫連接池?

數據庫連接池是程序啟動時建立足夠的數據庫連接,並將這些連接組成一個池,由程序動態地對池中的連接進行申請,使用和釋放。

2. 使用數據庫連接池原理及優點是什么?

數據庫連接池在初始化時將會創建一定數量的數據庫連接放到連接池中,連接池都將一直保證至少擁有這么多的連接數量,當有數據庫需要被連接的時候,它會向數據庫連接池申請資源和使用,使用完成后會釋放到數據庫連接池中。當然數據庫連接池中擁有最小連接數量和最大連接數量,當數據庫的連接超過連接池中最大的數量的時候,這些請求將被加入到等待隊列中。

其實他們的原理就好比我們公司的招聘前端開發一樣,當有A項目的時候,我們公司需要招聘一個前端開發去做項目,但是當公司有B、C、D、等項目的時候,或者很多項目的時候需要不斷的招聘前端開發,那么這樣會給公司帶來很多人力成本的。因此我們需要一個前端主管來管理這些前端資源。前端主管手下假如有5個前端開發,那么當A、B、C、D、E、項目來的時候,前端主管會依次把這些項目分配給對應的開發人員去跟進。但是當還有F等項目的時候,因為F項目已經超過前端人員的時候,沒有人再去支持這些個項目,因此這些項目需要排期,等A、B、C、D、E 其中任何一個開發完成后,上線了,然后這些開發人員就和數據庫一樣釋放資源,返回到前端組來,然后前端主管再把F項目分配到對應的開發人員。這個比方就好比可以理解為一個數據庫連接池了。而不是有n個項目需要招聘n個前端開發來做項目,那這樣的缺點是公司的人力成本會大大的增加。所以數據庫的鏈接池也是這個意思,當網站某一天有很大的流量的時候,數據庫服務器需要為每次鏈接創建一次數據庫鏈接。這樣就很浪費數據庫的資源,並且頻繁的創建和關閉數據庫的鏈接,很容易導致服務器內存溢出等情況發生。

連接池的作用是:數據庫的連接池負責分配,管理和釋放數據庫鏈接的。它允許應用程序重復使用一個現有的數據庫的鏈接。而不是重新創建一個。

3. 傳統的數據庫鏈接和數據庫連接池的運行機制有啥區別?

傳統的我們一般來java來說:java訪問數據庫的過程一般是如下:

1. 裝載數據庫驅動程序。
2. 通過JDBC建立數據庫的鏈接。
3. 訪問數據庫,執行一些sql語句。
4. 斷開及關閉數據庫的鏈接。

如上是一般的java訪問數據庫鏈接的過程。

下面我們使用數據庫的連接池的操作過程如下:

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();
      }
    })
  }
});

如下圖所示:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM