Posted on 2007-12-21 01:42
neter 閱讀(1833)
評論(2) 編輯 收藏 引用 所屬分類:
程序設(shè)計
相關(guān)技術(shù):
- 連接池
- 引用記數(shù)
- 多線程
- Timer類運行基理
- C#.Net
適宜人群
- 數(shù)據(jù)庫應(yīng)用程序程序員
- 系統(tǒng)分析員
- 模塊設(shè)計師
- 有一定功底的程序員
目錄
- 引言
- 數(shù)據(jù)庫連接池(Connection Pool)的工作原理
- 連接池關(guān)鍵問題分析
- 并發(fā)問題
- 事務(wù)處理
- 連接池的分配與釋放
- 連接池的配置與維護(hù)
-
關(guān)鍵議題
-
引用記數(shù)
-
如何實現(xiàn)事務(wù)處理
-
-
-
構(gòu)造方法
-
啟動服務(wù)StartService
-
停止服務(wù)StopService
-
申請 GetConnectionFormPool
-
釋放DisposeConnection
-
如何更新屬性
-
如何確定連接是否失效
-
使用線程管理連接池
-
threadCreate
-
threadCheck
-
引言
一般的數(shù)據(jù)庫應(yīng)用程序大致都遵循下面的步驟:
- 初始化程序
- 用戶在UI上輸入操作
- 由用戶操作產(chǎn)生數(shù)據(jù)庫操作
- 將數(shù)據(jù)庫操作遞交到數(shù)據(jù)庫服務(wù)器
- .... (重復(fù)2~4)
- 關(guān)閉應(yīng)用程序
而本文則著重講解上面第4步驟.在著一步驟中我們經(jīng)常是,打開數(shù)據(jù)庫連接操作數(shù)據(jù)庫,最后關(guān)閉數(shù)據(jù)庫.
在服務(wù)器端程序設(shè)計上與數(shù)據(jù)庫的操作顯得十分重要,因為你要處理的數(shù)據(jù)操作十分巨大.如果頻繁創(chuàng)建數(shù)據(jù)庫連接頻繁關(guān)閉數(shù)據(jù)庫連接則會引起效率低下甚至引發(fā)程序崩潰.
也許我們可以有另一種操作數(shù)據(jù)庫的形式,我們可以在程序運行時打開一個數(shù)據(jù)庫連接,讓這個連接永久存在直到程序'死亡',那么這樣做也有不安全隱患,我們知道一個對象存在時間越長或被使用次數(shù)越多則它表現(xiàn)的越不穩(wěn)定,著不穩(wěn)定因素是由于對象內(nèi)部可能存在的潛在設(shè)計問題產(chǎn)生,對于數(shù)據(jù)庫連接對象道理也一樣.我們不能保證一個Connection對象里面能一點問題不存在.所以我們也不敢長時間將它長時間占用內(nèi)存.
既然有這么多的問題由此我們需要一個能幫我們維護(hù)數(shù)據(jù)庫連接的東西-它就是連接池,網(wǎng)上有很多的連接池例子,但是多數(shù)都是簡單的例子,或者介紹比較復(fù)雜的連接池原理,沒有一個比較完整介紹和實現(xiàn)連接池的例子.這里就介紹你如何自己制作一個連接池.
對于共享資源,有一個很著名的設(shè)計模式:資源池(Resource Pool)。該模式正是為了解決資源的頻繁分配﹑釋放所造成的問題。為解決我們的問題,可以采用數(shù)據(jù)庫連接池技術(shù)。數(shù)據(jù)庫連接池的基本思想就是為數(shù)據(jù)庫連接建立一個“緩沖池”。預(yù)先在緩沖池中放入一定數(shù)量的連接,當(dāng)需要建立數(shù)據(jù)庫連接時,只需從“緩沖池”中取出一個,使用完畢之后再放回去。我們可以通過設(shè)定連接池最大連接數(shù)來防止系統(tǒng)無盡的與數(shù)據(jù)庫連接。更為重要的是我們可以通過連接池的管理機(jī)制監(jiān)視數(shù)據(jù)庫的連接的數(shù)量﹑使用情況,為系統(tǒng)開發(fā)﹑測試及性能調(diào)整提供依據(jù)。連接池的基本工作原理見下圖。
數(shù)據(jù)庫連接池(Connection Pool)的工作原理

連接池關(guān)鍵問題分析
1、并發(fā)問題
為了使連接管理服務(wù)具有最大的通用性,必須考慮多線程環(huán)境,即并發(fā)問題。這個問題相對比較好解決,因為各個語言自身提供了對并發(fā)管理的支持像java,c#等等,使用synchronized(java)lock(C#)關(guān)鍵字即可確保線程是同步的。使用方法可以參考,相關(guān)文獻(xiàn)。
2、事務(wù)處理
我們知道,事務(wù)具有原子性,此時要求對數(shù)據(jù)庫的操作符合“ALL-ALL-NOTHING”原則,即對于一組SQL語句要么全做,要么全不做。
我們知道當(dāng)2個線程公用一個連接Connection對象,而且各自都有自己的事務(wù)要處理時候,對于連接池是一個很頭疼的問題,因為即使Connection類提供了相應(yīng)的事務(wù)支持,可是我們?nèi)匀徊荒艽_定那個數(shù)據(jù)庫操作是對應(yīng)那個事務(wù)的,這是由于我們有2個線程都在進(jìn)行事務(wù)操作而引起的。為此我們可以使用每一個事務(wù)獨占一個連接來實現(xiàn),雖然這種方法有點浪費連接池資源但是可以大大降低事務(wù)管理的復(fù)雜性。
3、連接池的分配與釋放
連接池的分配與釋放,對系統(tǒng)的性能有很大的影響。合理的分配與釋放,可以提高連接的復(fù)用度,從而降低建立新連接的開銷,同時還可以加快用戶的訪問速度。
對于連接的管理可使用一個List。即把已經(jīng)創(chuàng)建的連接都放入List中去統(tǒng)一管理。每當(dāng)用戶請求一個連接時,系統(tǒng)檢查這個List中有沒有可以分配的連接。如果有就把那個最合適的連接分配給他(如何能找到最合適的連接文章將在關(guān)鍵議題中指出);如果沒有就拋出一個異常給用戶,List中連接是否可以被分配由一個線程來專門管理捎后我會介紹這個線程的具體實現(xiàn)。
4、連接池的配置與維護(hù)
連接池中到底應(yīng)該放置多少連接,才能使系統(tǒng)的性能最佳?系統(tǒng)可采取設(shè)置最小連接數(shù)(minConnection)和最大連接數(shù)(maxConnection)等參數(shù)來控制連接池中的連接。比方說,最小連接數(shù)是系統(tǒng)啟動時連接池所創(chuàng)建的連接數(shù)。如果創(chuàng)建過多,則系統(tǒng)啟動就慢,但創(chuàng)建后系統(tǒng)的響應(yīng)速度會很快;如果創(chuàng)建過少,則系統(tǒng)啟動的很快,響應(yīng)起來卻慢。這樣,可以在開發(fā)時,設(shè)置較小的最小連接數(shù),開發(fā)起來會快,而在系統(tǒng)實際使用時設(shè)置較大的,因為這樣對訪問客戶來說速度會快些。最大連接數(shù)是連接池中允許連接的最大數(shù)目,具體設(shè)置多少,要看系統(tǒng)的訪問量,可通過軟件需求上得到。
如何確保連接池中的最小連接數(shù)呢?有動態(tài)和靜態(tài)兩種策略。動態(tài)即每隔一定時間就對連接池進(jìn)行檢測,如果發(fā)現(xiàn)連接數(shù)量小于最小連接數(shù),則補(bǔ)充相應(yīng)數(shù)量的新連接,以保證連接池的正常運轉(zhuǎn)。靜態(tài)是發(fā)現(xiàn)空閑連接不夠時再去檢查。