資料庫連線池的設計考慮 轉貼

2021-04-02 12:38:25 字數 1406 閱讀 3092

週末檢到本j2ee的書翻了兩下(1200多頁,我靠),其中有提到jdbc的連線池,小有興趣,因為我的vc-ado程式也可以考慮實現個簡單連線池來用用。

ado的連線有幾個特點:

1.它不是執行緒安全的。容易造成事務死鎖。一般單條sql的不會死鎖,但比如執行事務或游標時就很容易死鎖掉.所以一般的多執行緒程式不提倡重用同乙個ado

connection

2:ado會自己管理oledb連線池,當呼叫connection的close方法,僅僅是將連線放到池裡,直到超時或程式關閉。一般來說,乙個程式使用相同連線串建立的連線都

會被自動池化。ado.net可以明確的選擇是否使用池。

3:如果使用智慧型指標_connectionprt,其close方式只是關閉連線(放到池),而沒有釋放物件。

4:但如果一直不呼叫close,該連線則無法被其他執行緒/程序共享

5:在某個連線上忙,且程式要求在該連線上執行操作的時候,ado其實會開啟乙個臨時連線供使用。

之所以考慮ado的連線池,主要是執行一些簡單的sql時(如insert,delete..),不需要多建立很多ado connection物件。

另外也隨便記錄一點設計乙個池要考慮的一些要素:

1:池化。包括批次初始化和釋放連線。可以設計成忙/閒佇列管理,一有呼叫,就從閒佇列裡取出乙個,並將其引用放到忙佇列裡;或者採用迴圈陣列,通過記

數管理。傾向於使用後者,因為前者最多的連線數不能超出佇列大小,而實際上每個連線是可以被客戶端復用的。記數管理的目的是獲取連線池裡被引用最少的一

個連線。

2:給客戶端統一的獲取和釋放介面。pool.getconnection這個好理解。也可以定義乙個pool.releaseconnection(connection)介面,但客戶端**難免會習慣性

的呼叫connection.close(即使禁止)。最好的辦法就是實現或者說過載connection介面,接管或遮蔽close.使close的預設動作是將連線返回pool裡待用(或者減

少在連線上的使用記數).

3:檢測連線上的事務完成狀態。在乙個復用的連線上交叉執行事務是不應該的。在乙個事務沒有執行完畢時,不允許加入另乙個事務(通過程序內鎖實現)。但目

前編寫的**基本上沒有使用到transaction的,所以不著急。

4:從2可以看到,最好是定義乙個pooledconnection介面,客戶端對介面例項操作,而不是直接對connection物件操作,這樣才能更好的實現池化的一些控制邏

輯。但這樣又牽涉到介面和物件間的同步維護。最好是用繼承的方法實現,除了開啟關閉等直接影響連線狀況的介面外,還是給客戶端對物件的大部分直接控制介面。

5:連線池應檢測connection的連線狀態,斷連的連線應該被標記或直接移出連線池。

資料庫連線池 Redis連線池

基本原理 在內部物件池中,維護一定數量的資料庫連線,並對外暴露資料庫連線的獲取和返回方法。如外部使用者可通過getconnection方法獲取資料庫連線,使用完畢後再通過releaseconnection方法將連線返回,注意此時的連線並沒有關閉,而是由連線池管理器 並為下一次使用做好準備。2.作用 ...

資料庫連線池

實現資料連線池,讓系統有更高有執行效率 using system using system.data using system.data.sqlclient using system.collections using system.threading public class dataaccess...

資料庫連線池

資料庫連線池概述 資料庫連線是一種關鍵的有限的昂貴的資源,這一點在多使用者的網頁應用程式中體現得尤為突出。對資料庫連線的管理能顯著影響到整個應用程式的伸縮性和健壯性,影響到程式的效能指標。資料庫連線池正是針對這個問題提出來的。資料庫連線池負責分配 管理和釋放資料庫連線,它允許應用程式重複使用乙個現有...