詳解數據庫鏈接池概念、原理、運行機制等

概述

  數據庫鏈接池是負責分配、管理和釋放數據庫鏈接,它容許應用程序重複使用一個現有的數據庫鏈接,而不是再從新創建一個。那麼其中的運行機制又是怎樣的呢?今天主要介紹一下數據庫鏈接池原理和經常使用的鏈接池。java

01 爲何要使用鏈接池

  數據庫鏈接是一種關鍵的有限的昂貴的資源,這一點在多用戶的網頁應用程序中體現得尤其突出。 一個數據庫鏈接對象均對應一個物理數據庫鏈接,每次操做都打開一個物理鏈接,使用完都關閉鏈接,這樣形成系統的性能低下。數據庫

  數據庫鏈接池的解決方案是在應用程序啓動時創建足夠的數據庫鏈接,並講這些鏈接組成一個鏈接池(簡單說:在一個「池」裏放了好多半成品的數據庫鏈接對象),由應用程序動態地對池中的鏈接進行申請、使用和釋放。對於多於鏈接池中鏈接數的併發請求,應該在請求隊列中排隊等待。而且應用程序能夠根據池中鏈接的使用率,動態增長或減小池中的鏈接數。c#

  鏈接池技術儘量多地重用了消耗內存地資源,大大節省了內存,提升了服務器地服務效率,可以支持更多的客戶服務。經過使用鏈接池,將大大提升程序運行效率,同時,咱們能夠經過其自身的管理機制來監視數據庫鏈接的數量、使用狀況等。服務器

02 傳統的鏈接機制與數據庫鏈接池運行機制區別

一、不使用鏈接池流程

下面以訪問MySQL爲例,執行一個SQL命令,若是不使用鏈接池,須要通過哪些流程。網絡

不使用數據庫鏈接池的步驟:多線程

  1. TCP創建鏈接的三次握手
  2. MySQL認證的三次握手
  3. 真正的SQL執行
  4. MySQL的關閉
  5. TCP的四次握手關閉

能夠看到,爲了執行一條SQL,卻多了很是多網絡交互。併發

優勢:性能

  • 實現簡單

缺點:spa

  • 網絡IO較多
  • 數據庫的負載較高
  • 響應時間較長及QPS較低
  • 應用頻繁的建立鏈接和關閉鏈接,致使臨時對象較多,GC頻繁
  • 在關閉鏈接後,會出現大量TIME_WAIT 的TCP狀態(在2個MSL以後關閉)

二、使用鏈接池流程

使用數據庫鏈接池的步驟:線程

 

第一次訪問的時候,須要創建鏈接。 可是以後的訪問,均會複用以前建立的鏈接,直接執行SQL語句。

優勢:

  • 較少了網絡開銷
  • 系統的性能會有一個實質的提高
  • 沒了麻煩的TIME_WAIT狀態

03 數據庫鏈接池的工做原理

鏈接池的工做原理主要由三部分組成,分別爲

  • 鏈接池的創建
  • 鏈接池中鏈接的使用管理
  • 鏈接池的關閉

第1、鏈接池的創建。

  通常在系統初始化時,鏈接池會根據系統配置創建,並在池中建立了幾個鏈接對象,以便使用時能從鏈接池中獲取。鏈接池中的鏈接不能隨意建立和關閉,這樣避免了鏈接隨意創建和關閉形成的系統開銷。

Java中提供了不少容器類能夠方便的構建鏈接池,例如Vector、Stack等。

第2、鏈接池的管理。

  鏈接池管理策略是鏈接池機制的核心,鏈接池內鏈接的分配和釋放對系統的性能有很大的影響。其管理策略是:

當客戶請求數據庫鏈接時,首先查看鏈接池中是否有空閒鏈接,若是存在空閒鏈接,則將鏈接分配給客戶使用;若是沒有空閒鏈接,則查看當前所開的鏈接數是否已經達到最大鏈接數,若是沒達到就從新建立一個鏈接給請求的客戶;若是達到就按設定的最大等待時間進行等待,若是超出最大等待時間,則拋出異常給客戶。

當客戶釋放數據庫鏈接時,先判斷該鏈接的引用次數是否超過了規定值,若是超過就從鏈接池中刪除該鏈接,不然保留爲其餘客戶服務。

該策略保證了數據庫鏈接的有效複用,避免頻繁的創建、釋放鏈接所帶來的系統資源開銷。

第3、鏈接池的關閉。

當應用程序退出時,關閉鏈接池中全部的鏈接,釋放鏈接池相關的資源,該過程正好與建立相反。

04

鏈接池須要注意的點

一、併發問題

爲了使鏈接管理服務具備最大的通用性,必須考慮多線程環境,即併發問題。

這個問題相對比較好解決,由於各個語言自身提供了對併發管理的支持像java,c#等等,使用synchronized(java)lock(C#)關鍵字便可確保線程是同步的。

二、事務處理

咱們知道,事務具備原子性,此時要求對數據庫的操做符合「ALL-OR-NOTHING」原則,即對於一組SQL語句要麼全作,要麼全不作。

咱們知道當2個線程共用一個鏈接Connection對象,並且各自都有本身的事務要處理時候,對於鏈接池是一個很頭疼的問題,由於即便Connection類提供了相應的事務支持,但是咱們仍然不能肯定那個數據庫操做是對應那個事務的,這是因爲咱們有2個線程都在進行事務操做而引發的。

爲此咱們可使用每個事務獨佔一個鏈接來實現,雖然這種方法有點浪費鏈接池資源可是能夠大大下降事務管理的複雜性。

三、鏈接池的分配與釋放

鏈接池的分配與釋放,對系統的性能有很大的影響。合理的分配與釋放,能夠提升鏈接的複用度,從而下降創建新鏈接的開銷,同時還能夠加快用戶的訪問速度。

對於鏈接的管理可以使用一個List。即把已經建立的鏈接都放入List中去統一管理。每當用戶請求一個鏈接時,系統檢查這個List中有沒有能夠分配的鏈接。若是有就把那個最合適的鏈接分配給他,若是沒有就拋出一個異常給用戶。

4、鏈接池的配置與維護

鏈接池中到底應該放置多少鏈接,才能使系統的性能最佳?

系統可採起設置最小鏈接數(minConnection)和最大鏈接數(maxConnection)等參數來控制鏈接池中的鏈接。比方說,最小鏈接數是系統啓動時鏈接池所建立的鏈接數。若是建立過多,則系統啓動就慢,但建立後系統的響應速度會很快;若是建立過少,則系統啓動的很快,響應起來卻慢。這樣,能夠在開發時,設置較小的最小鏈接數,開發起來會快,而在系統實際使用時設置較大的,由於這樣對訪問客戶來講速度會快些。最大鏈接數是鏈接池中容許鏈接的最大數目,具體設置多少,要看系統的訪問量,可經過軟件需求上獲得。

如何確保鏈接池中的最小鏈接數呢?有動態和靜態兩種策略。動態即每隔必定時間就對鏈接池進行檢測,若是發現鏈接數量小於最小鏈接數,則補充相應數量的新鏈接,以保證鏈接池的正常運轉。靜態是發現空閒鏈接不夠時再去檢查。


總結

時至今日,雖然每一個應用(須要RDBMS的)都離不開鏈接池,但在實際使用的時候,鏈接池已經能夠作到「隱形」了。也就是說在一般狀況下,鏈接池完成項目初始化配置以後,就再不須要再作任何改動了。

相關文章
相關標籤/搜索