數據庫連接池的工作原理

對於共享資源,有一個很著名的設計模式:資源池(Resource Pool)。該模式正是爲了解決資源的頻繁分配﹑釋放所造成的問題。爲解決我們的問題,可以採用數據庫連接池技術。數據庫連接池的基本思想就是爲數據庫連接建立一個“緩衝池”。預先在緩衝池中放入一定數量的連接,當需要建立數據庫連接時,只需從“緩衝池”中取出一個,使用完畢之後再放回去。我們可以通過設定連接池最大連接數來防止系統無盡的與數據庫連接。更爲重要的是我們可以通過連接池的管理機制監視數據庫的連接的數量﹑使用情況,爲系統開發﹑測試及性能調整提供依據。

      連接池關鍵問題分析

  1、併發問題

  爲了使連接管理服務具有最大的通用性,必須考慮多線程環境,即併發問題。這個問題相對比較好解決,因爲各個語言自身提供了對併發管理的支持像java,c#等等,使用synchronized(java)lock(C#)關鍵字即可確保線程是同步的。使用方法可以參考,相關文獻。

  2、事務處理

  我們知道,事務具有原子性,此時要求對數據庫的操作符合“ALL-ALL-NOTHING”原則,即對於一組SQL語句要麼全做,要麼全不做。
  我們知道當2個線程公用一個連接Connection對象,而且各自都有自己的事務要處理時候,對於連接池是一個很頭疼的問題,因爲即使Connection類提供了相應的事務支持,可是我們仍然不能確定那個數據庫操作是對應那個事務的,這是由於我們有2個線程都在進行事務操作而引起的。爲此我們可以使用每一個事務獨佔一個連接來實現,雖然這種方法有點浪費連接池資源但是可以大大降低事務管理的複雜性。

  3、連接池的分配與釋放

  連接池的分配與釋放,對系統的性能有很大的影響。合理的分配與釋放,可以提高連接的複用度,從而降低建立新連接的開銷,同時還可以加快用戶的訪問速度。
  對於連接的管理可使用一個List。即把已經創建的連接都放入List中去統一管理。每當用戶請求一個連接時,系統檢查這個List中有沒有可以分配的連接。如果有就把那個最合適的連接分配給他(如何能找到最合適的連接文章將在關鍵議題中指出);如果沒有就拋出一個異常給用戶,List中連接是否可以被分配由一個線程來專門管理捎後我會介紹這個線程的具體實現。

   4、連接池的配置與維護

  連接池中到底應該放置多少連接,才能使系統的性能最佳?系統可採取設置最小連接數(minConnection)和最大連接數(maxConnection)等參數來控制連接池中的連接。比方說,最小連接數是系統啓動時連接池所創建的連接數。如果創建過多,則系統啓動就慢,但創建後系統的響應速度會很快;如果創建過少,則系統啓動的很快,響應起來卻慢。這樣,可以在開發時,設置較小的最小連接數,開發起來會快,而在系統實際使用時設置較大的,因爲這樣對訪問客戶來說速度會快些。最大連接數是連接池中允許連接的最大數目,具體設置多少,要看系統的訪問量,可通過軟件需求上得到。
  如何確保連接池中的最小連接數呢?有動態和靜態兩種策略。動態即每隔一定時間就對連接池進行檢測,如果發現連接數量小於最小連接數,則補充相應數量的新連接,以保證連接池的正常運轉。靜態是發現空閒連接不夠時再去檢查。

關鍵議題

  • 引用記數

 

  在分配、釋放策略對於有效複用連接非常重要,我們採用的方法也是採用了一個很有名的設計模式:Reference Counting(引用記數)。該模式在複用資源方面用的非常廣泛,我們把該方法運用到對於連接的分配釋放上。每一個數據庫連接,保留一個引用記數,用來記錄該連接的使用者的個數。具體的實現上,我們對Connection類進行進一步包裝來實現引用記數。被包裝的Connection類我們提供2個方法來實現引用記數的操作,一個是Repeat(被分配出去)Remove(被釋放回來);然後利用RepeatNow屬性來確定當前被引用多少,具體是哪個用戶引用了該連接將在連接池中登記;最後提供IsRepeat屬性來確定該連接是否可以使用引用記數技術。一旦一個連接被分配出去,那麼就會對該連接的申請者進行登記,並且增加引用記數,當被釋放回來時候就刪除他已經登記的信息,同時減少一次引用記數。

  這樣做有一個很大的好處,使得我們可以高效的使用連接,因爲一旦所有連接都被分配出去,我們就可以根據相應的策略從使用池中挑選出一個已經正在使用的連接用來複用,而不是隨意拿出一個連接去複用。

                                                                                           (二)

       連接池用於創建和管理數據庫連接的緩衝池技術,緩衝池中的連接可以被任何需要他們的線程使用。當一個線程需要用JDBC對一個數據庫操作時,將從池中請求一個連接。當這個連接使用完畢後,將返回到連接池中,等待爲其他的線程服務。

        連接池的主要優點有以下三個方面。

        第一、減少連接創建時間。連接池中的連接是已準備好的、可重複使用的,獲取後可以直接訪問數據庫,因此減少了連接創建的次數和時間。

        第二、簡化的編程模式。當使用連接池時,每一個單獨的線程能夠像創建一個自己的JDBC連接一樣操作,允許用戶直接使用JDBC編程技術。

        第三、控制資源的使用。如果不使用連接池,每次訪問數據庫都需要創建一個連接,這樣系統的穩定性受系統連接需求影響很大,很容易產生資源浪費和高負載異常。連接池能夠使性能最大化,將資源利用控制在一定的水平之下。連接池能控制池中的連接數量,增強了系統在大量用戶應用時的穩定性。

        下面,簡單的闡述下連接池的工作原理。

         連接池技術的核心思想是連接複用,通過建立一個數據庫連接池以及一套連接使用、分配和管理策略,使得該連接池中的連接可以得到高效、安全的複用,避免了數據庫連接頻繁建立、關閉的開銷。

        連接池的工作原理主要由三部分組成,分別爲連接池的建立、連接池中連接的使用管理、連接池的關閉。

        第一、連接池的建立。一般在系統初始化時,連接池會根據系統配置建立,並在池中創建了幾個連接對象,以便使用時能從連接池中獲取。連接池中的連接不能隨意創建和關閉,這樣避免了連接隨意建立和關閉造成的系統開銷。Java中提供了很多容器類可以方便的構建連接池,例如Vector、Stack等。

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

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

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

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

        第三、連接池的關閉。當應用程序退出時,關閉連接池中所有的連接,釋放連接池相關的資源,該過程正好與創建相反。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章