




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、java中數(shù)據(jù)庫連接池原理機制的詳細講解連接池的基本工作原理1、基本概念及原理由上面的分析可以看出,問邂的根源就在于對逆據(jù)厘連接資源的低效管理。我們知道,對于共亨資源,有一個很著名的設 計模式:資源池(resource pool) «該模式正是為了解決資源的頻繁分配?釋放所造成的問題。為解決上述問題,可以采用數(shù) 據(jù)庫連接池技術。數(shù)據(jù)庫連接池的基本思想就是為數(shù)據(jù)庫連接建立-個”緩沖池”。預先在緩沖池中放入定數(shù)雖的連接,當需要 建立數(shù)據(jù)庫連接時,只需從”緩沖池"中取出一個,使用完畢z后再放冋去。我們可以通過設定連接池最大連接數(shù)來防i上系統(tǒng)無盡 的與數(shù)據(jù)庫連接。更為貢要的是我們可
2、以通過連接池的管理機制監(jiān)視數(shù)據(jù)庫的連接的數(shù)量?便用情況,為系統(tǒng)開發(fā)?測試及性能 調(diào)整提供依據(jù)。2、服務器自帶的連接池jdbc的api中沒有提供連接池的方法。些大型的web應用服務器如bea的weblogic和ibm的websphere等提供 了連接池的機制,但是必須有其第三方的專用類方法支持連接池的用法。連接池關鍵問題分析1、并發(fā)問題為了使連接管理服務具有最大的通用性,必須考慮名線程環(huán)境,即并發(fā)問題。這個問題相對比較好解決,因為java語言自 身提供了對并發(fā)管理的支持,使用synchronized關鍵字即可確保線程杲同步的。使用方法為直接在類方法前面加上synchronized 關鍵字,如:p
3、ublic synchronized connection getconnection()2、多數(shù)據(jù)庫服務器和名用戶對于大型的金業(yè)級應用,常常需要同時連接不同的數(shù)據(jù)庫(如連接oracle和sybase)。如何連接不同的數(shù)據(jù)庫呢?我們采 用的策略是:設訃一個符合單例模式的連接池管理類,在連接池管理類的唯一實例被創(chuàng)建時讀取一個資源文件,其中資源文件 中存放著多個數(shù)據(jù)庫的url地址()?用戶名()?密碼()等信息。in tx.url=172.21.15.123: 5000/tx_it, tx.user=yang, tx.password=yang321,根據(jù)資源文件捉供的信息,創(chuàng)建女個連接池類的實例
4、,每一個實例都是一個待定數(shù)據(jù)庫的連接池。連按 池管理類實例為每個連接池實例取一個名字,通過不同的名字來管理不同的連接池。對于同一個數(shù)據(jù)庫有筋個用戶使用不同的名稱和密碼訪問的情況,也可以通過資源文件處理,即在資源文件中設置筋個具 冇相同url地址,但具有不同用戶名和密碼的數(shù)據(jù)庫連接信息。3、事務處理我們知道,爭務具冇廉子性,此時要求對數(shù)據(jù)庫的操作符介"all-all-nothing"原則,即對于一組sql涪句耍么全做,耍 么全不做。在java語護卩,connection類本身提供了對型務的支持,町以通過設置connection的autocommit屈性為false,然后顯 式
5、的調(diào)用commit或rollback方法來實現(xiàn)。但要高效的進行connection復用,就必須提供相應的事務支持機制??刹捎妹恳粋€ 事務獨占一個連接來實現(xiàn),這種方法可以大大降低事務管理的復雜性。4、連接池的分配與釋放連接池的分配與釋放,對系統(tǒng)的性能有很大的影響。合理的分配與釋放,可以提高連接的復用度,從而降低建立新連接的 開銷,同時還可以加快用戶的訪問速度。對于連接的管理可使用空閑池。即把已經(jīng)創(chuàng)建但尚未分配出去的連接按創(chuàng)建時間存放到一個空閑池中。每當用戶請求一個 連接時,系統(tǒng)首先檢査空閑池內(nèi)有沒召空閑連接。如果有就把建立時間最長(通過容器的順序存放實現(xiàn))的那個連接分配給他 (實際是先做連接是否
6、有效的判斷,如呆可用就分配給用戶,如不可用就把這個連接從空閑池刪掉,重新檢測空閑池是否還有 連接);如果沒冇則檢杳當前所開連接池是否達到連接池所允許的城大連接數(shù)(maxconn),如果沒冇達到,就新建一個連接,如 果已經(jīng)達到,就等待一定的時間(timeout)。如果在等待的時間內(nèi)冇連接被釋放出來就可以把這個連接分配給等待的用戶,如 杲等待時間超過預定時間timeout,則返回空值(null)。系統(tǒng)對已經(jīng)分配出去正在使用的連接只做計數(shù),當使用完后再返還給空 閑池。對于空閑連接的狀態(tài),可開辟專門的線程定時檢測,這樣會花費一定的系統(tǒng)開銷,但可以保證較快的響應速度。也可采 取不開辟專門線程,只是在分配
7、前檢測的方法。5、連接池的配置與維護連接池中到底應該放圧幺少連接,才能使系統(tǒng)的性能最件:?系統(tǒng)可采取設邑繪小連接數(shù)(minconn閉誠人連接數(shù)(maxconn) 來控制連接池小的連接。星小連接數(shù)足系統(tǒng)啟動時連接池所創(chuàng)現(xiàn)的連接數(shù)。如果創(chuàng)建過多,則系統(tǒng)啟動就慢,但創(chuàng)建后系統(tǒng)的 響應速度會很快;如果創(chuàng)建過少,則系統(tǒng)啟動的很快,響應起來卻愷。這樣,可以在開發(fā)時,設置較小的最小連接數(shù),開發(fā)起來 會快,而在系統(tǒng)實際使用時設置較衣的,因為這樣對訪問客戶來說速度會快些。最大連接數(shù)是連接池屮允許連接的最大數(shù)h, 具體設世篡少,要看系統(tǒng)的訪問雖,可通過反復測試,找到晝住點。如何確保連接池屮的最小連接數(shù)呢?冇動態(tài)和
8、靜態(tài)兩種策略。動態(tài)即每隔定時間就對連接池進行檢測,如果發(fā)現(xiàn)連接數(shù)量 小于最小連接數(shù),則補充相應數(shù)量的新連接,以保證連接池的正常運轉。靜態(tài)是發(fā)現(xiàn)空閑連接不夠時再去檢査。連接池的實現(xiàn)1、連接池模型木文討論的連接池包括 個連接池類(dbconnectionpool)和-個連接池管理類(dbconnetionpoolmanager)。連接池 類是對某-數(shù)據(jù)庫所冇連接的"緩沖池",主耍實現(xiàn)以下功能:從連接池獲取或創(chuàng)建可用連接;使用完畢z后,把連接返還給 連接池;在系統(tǒng)關閉前,斷開所冇連接并釋放連接山用的系統(tǒng)資源;還能夠處理無效連接(原來登記為可用的連接,由于某種 原因不再可用,如超時
9、,通訊問題),并能夠限制連接池中的連接總數(shù)不低于某個預定值和不超過某個預定值。連接池管理類是連接池類的外覆類(wrapper),符合單例模式,即系統(tǒng)中只能有一個連接池管理類的實例。其主要用于對 多個連接池對象的管理,具有以下功能:裝載并注冊特定數(shù)據(jù)庫的jdbc驅動程序;根據(jù)屬性文件給定的信息,創(chuàng)建連接池 對彖;為方便管理多個連接池對象,為毎一個連接池對象取-個名字,實現(xiàn)連接池名字與其實例z間的映射;跟蹤乳戶使用連 接惜況,以便需要是關閉連接秤放資源。連接池管理類的引入主要是為了方便對*個連接池的使川和管理,如系統(tǒng)需要連接不 同的數(shù)據(jù)庫,或連接柑同的數(shù)據(jù)庫但由于安全性問題,需要不同的用戶使用不同
10、的名稱和密碼。2、連接池實現(xiàn)下面給屮連接池類和連接池管理類的主要屬性及所要實現(xiàn)的基本接口 :public class dbconnectionpool implements timerlistenerfprivate int checkedout;/已被分配出去的連接數(shù)private arraylist freec onn ecti ons 二 new arraylist();/容器,空閑池,根據(jù)創(chuàng)建時間順序存放已創(chuàng)建但尚未分配出去的連接private int minconn;/連接池里連接的最小數(shù)量private int maxconn;/連接池里允許存在的最大連接數(shù)private stri
11、ng name/為這個連接池取個名字,方便管理private string password;/連接數(shù)據(jù)庫時需耍的密碼private string url;/所要創(chuàng)建連接的數(shù)據(jù)庫的地址private string user;/連接數(shù)據(jù)庫時需要的用戶名public timer timer;/定時器public dbconnectionpool(string name,string url,string user,string password,int maxconn)/公開的構造函數(shù)public synchronized void freeconnection(connection con)使用
12、完畢之后,把連接返還給空閑池public synchr on ized conn ection getc onn ecti on(long timeout)得到個連接,timeout是等待時間public synchronized void release()斷開所有連接,釋放占用的系統(tǒng)資源private conn ection newcon nection()/新建一個數(shù)據(jù)庫連接public synchr on ized void timereve nt()/定時器事件處理函數(shù)public class dbconnectionmanager static private dbconnecti
13、onmanager instance;連接池管理類的唯一實例static private int clients;/客戶數(shù)量private arraylist drivers=new arraylist();/容器,存放數(shù)據(jù)庫驅動程序private hashmap pools = new hashmap();以name/value的形式存取連接池對象的名字及連接池對象static synchronized public dbconnectionmanager getlnstance()/"如果啡一的實例instance已經(jīng)創(chuàng)建,直接返回這個實例;否則,調(diào)用私仃構造函數(shù),創(chuàng)建連接池管理
14、類的唯一實例private dbconnectionmanager()私有構造函數(shù),在其中調(diào)用初始化函數(shù)init()public void freeconnection(string name,connection con)釋放一個連接,name是個連接池對象的名字public connection getconnection(string name)從名?為name的連接池對象屮得到個連接public connection getconnection(string namejong time)從名字為name的連接池對象中取得一個連接,time是等待時間public synchronized
15、 void release。/釋放所有資源private void createpools(properties props)/根據(jù)屬性文件提供的信息,創(chuàng)建一個或多個連接池private void init()/初始化連接池管理類的唯實例,由私有構造函數(shù)調(diào)用private void loaddrivers(properties props)/裝載數(shù)據(jù)庫驅動程序3、連接池使用:血所實現(xiàn)的連接池在程字開發(fā)時如何血川到系統(tǒng)中呢?下血以servlet為例說明連接池的使用。servlet的生命周期是:在開始建立servlet時,調(diào)用其初始化(init)方法。z厲每個用戶請求都導致個調(diào)用前面建立的實例的s
16、ervice方法的線程。最后,當服務器決定卸域一個servlet時,它首先調(diào)用該servlet的destroy方法。根據(jù)servlet的暮點,我們町以在初始化函數(shù)中生成連接池管理類的唯-實例(其中包括創(chuàng)建-個或多個連接哼)。如: public void init() throws servletexceptionconn mgr=dbc onn ecti onman ager.getl nstan ce();然后就對以在service方法屮通過連接池名稱使用連接池,執(zhí)行數(shù)據(jù)庫操作。最后在destroy方法中釋放占用的系統(tǒng)資源,public void destroy()conn mgr.rele
17、ase();super.destroy();結束語在便用jdbc進行與數(shù)據(jù)庫有關的應用開發(fā)中,數(shù)據(jù)庫連接的管理是一個難點。很多時候,連接的混亂管理所適成的系統(tǒng) 資源開銷過大成為制約大型企業(yè)級應用效率的瓶頸。對于眾多用戶訪問的web應用,采用數(shù)據(jù)庫連接技術的系統(tǒng)在效率和穩(wěn)定 性上比采用傳統(tǒng)的如他方式的系統(tǒng)要好很名o木文閘述了使用jdbc訪問數(shù)據(jù)庫的技術?討論了基于連接池技術的數(shù)據(jù)庫連接管 理的關鍵問題并給出了一個實現(xiàn)模型。文章所給出的是連接池管理程序的-種基木模式,為提高系統(tǒng)的格體性能,在此基礎上 還可以進行很多有意義的擴展。首先說明下關于數(shù)據(jù)庫連接池:數(shù)據(jù)庫連接是一種關鍵的有限的昂貴的資源,這
18、一點在多用戶的網(wǎng)頁應用程序中 體現(xiàn)得尤為突岀。對數(shù)據(jù)庫連接的管理能顯著影響到整個應用程序的伸縮性和健 壯性,影響到程序的性能指標。數(shù)據(jù)庫連接池正是針對這個問題提岀來的。數(shù)據(jù)庫連接池負責分配、管理和釋放數(shù)據(jù)庫連接,它允許應用程序重復使用一個 現(xiàn)有的數(shù)據(jù)庫連接,而再不是重新建立一個;釋放空閑時間超過最大空閑時間的 數(shù)據(jù)庫連接來避免因為沒有釋放數(shù)據(jù)庫連接而引起的數(shù)據(jù)庫連接遺漏。這項技術 能明顯提高對數(shù)據(jù)庫操作的性能。數(shù)據(jù)庫連接池在初始化時將創(chuàng)建一定數(shù)量的數(shù)據(jù)庫連接放到連接池屮,這些數(shù)據(jù) 庫連接的數(shù)量是由最小數(shù)據(jù)庫連接數(shù)來設定的。無論這些數(shù)據(jù)庫連接是否被使 用,連接池都將一宜保證至少擁有這么多的連接數(shù)量。連接池的最人數(shù)據(jù)庫連接 數(shù)量限定了這個連接池能占有的最大連接數(shù),當應用程序向連接池請求的連接數(shù) 超過最大連接數(shù)量時,這些請求將被加入到等待隊列小。數(shù)據(jù)庫連接池的最小連接數(shù)和最大連接數(shù)的設置要考慮到下列兒個因素:1)最小連接數(shù)是連接池一直保持的數(shù)據(jù)庫連接,所以如果應用程序對數(shù)據(jù)庫連 接的使用量不大,將會有大量的數(shù)據(jù)庫連接資源被浪費;2)最大連接數(shù)是連接池能申請的最大連接數(shù),如果數(shù)據(jù)庫連接請求超過此數(shù), 后面的數(shù)據(jù)庫連接請求將被加入到等待隊列屮,這會影響之后的數(shù)據(jù)庫操
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年數(shù)控刃磨床合作協(xié)議書
- 2025年共振柱試驗機合作協(xié)議書
- 診所合同范本(2篇)
- 財務顧問融資協(xié)議書(2篇)
- 2025年鑄造輔助材料合作協(xié)議書
- 新救災工作計劃
- 二零二五年度小超市員工勞動合同加班時間記錄及審批合同
- 二零二五年度廣告品牌推廣與傳播合同
- 二零二五年度勞動合同法調(diào)整下企業(yè)高管競業(yè)禁止合同
- 天津2025年度房屋租賃合同(含租金遞增條款)
- 少兒美術課件- 9-12歲 素描班《場景素描》
- 九年級化學學情分析
- 金融工程.鄭振龍(全套課件560P)
- 國家二級公立醫(yī)院績效考核醫(yī)療質量相關指標解讀
- 血液透析的醫(yī)療質量管理與持續(xù)改進
- GA/T 2073-2023法庭科學血液中碳氧血紅蛋白檢驗分光光度法
- 學前教育鋼琴基礎介紹課件
- 直播電商可行性分析
- 橋式起重機日常檢查保養(yǎng)記錄表
- 人教版小學四年級下冊《體育與健康》全冊教案
- 法律文書寫作(第五版)PPT完整全套教學課件
評論
0/150
提交評論