基于JDBC的數(shù)據(jù)庫連接池技術(shù)的研究與設(shè)計_第1頁
基于JDBC的數(shù)據(jù)庫連接池技術(shù)的研究與設(shè)計_第2頁
基于JDBC的數(shù)據(jù)庫連接池技術(shù)的研究與設(shè)計_第3頁
基于JDBC的數(shù)據(jù)庫連接池技術(shù)的研究與設(shè)計_第4頁
基于JDBC的數(shù)據(jù)庫連接池技術(shù)的研究與設(shè)計_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、基于JDBC的數(shù)據(jù)庫連接池技術(shù)的研究與設(shè)計摘要本文介紹了基于JDB的數(shù)據(jù)庫連接池的工作原理,闡述了連接池技術(shù)的事務(wù)處理、多數(shù)據(jù)庫效勞器等各項關(guān)鍵技術(shù),提出了一個高效的連接池管理策略,最后詳細(xì)說明了數(shù)據(jù)庫連接池應(yīng)用的詳細(xì)實現(xiàn)過程。關(guān)鍵詞JDB;數(shù)據(jù)庫;連接池;事務(wù)處理隨著信息技術(shù)的高速開展與廣泛應(yīng)用,數(shù)據(jù)庫技術(shù)在信息技術(shù)領(lǐng)域中的位置越來越重要,尤其是網(wǎng)絡(luò)應(yīng)用和電子商務(wù)的迅速開展,都需要數(shù)據(jù)庫技術(shù)支持動態(tài)eb站點(diǎn)的運(yùn)行,而傳統(tǒng)的開發(fā)形式是:首先在主程序如Servlet、Beans中建立數(shù)據(jù)庫連接;然后進(jìn)展SQL操作,對數(shù)據(jù)庫中的對象進(jìn)展查詢、修改和刪除等操作;最后斷開數(shù)據(jù)庫連接。使用這種開發(fā)形式,

2、對于一個簡單的數(shù)據(jù)庫應(yīng)用,由于數(shù)據(jù)庫的訪問不是很頻繁,只需要在訪問數(shù)據(jù)庫時創(chuàng)立一個連接,用完后就關(guān)閉它,這樣做不會明顯的增大系統(tǒng)的開銷。但是對于一個復(fù)雜的數(shù)據(jù)庫應(yīng)用,情況就完全不同:頻繁的建立、關(guān)閉數(shù)據(jù)庫,會極大的降低系統(tǒng)的性能,增大系統(tǒng)的開銷,甚至成為系統(tǒng)的瓶頸。另外使用這種傳統(tǒng)的形式,還必須管理數(shù)據(jù)庫的每一個連接,以確保他們能正確關(guān)閉,假如出現(xiàn)程序異常而導(dǎo)致某些連接未能關(guān)閉,將引起數(shù)據(jù)庫系統(tǒng)中的內(nèi)存泄露,最終不得不重啟數(shù)據(jù)庫。因此采用運(yùn)行速度更快、數(shù)據(jù)庫訪問效率更高的數(shù)據(jù)庫技術(shù),以進(jìn)步系統(tǒng)的運(yùn)行效率將是至關(guān)重要的。為理解決這一問題,在JDB2.0中提出了JDB連接池技術(shù),通過在客戶之間共享

3、一組連接,而不是在它們需要的時候再為它們生成,這樣就可以改善資源使用,進(jìn)步應(yīng)用程序的響應(yīng)才能。1JDB概述JDBJavaDatabasennetivity,Java數(shù)據(jù)庫連接是一種用于執(zhí)行SQL語句的JavaAPI,可以為多種關(guān)系型數(shù)據(jù)庫如rale、Sybase、SQLServer、Aess等提供統(tǒng)一訪問接口,它由一組Java語言編寫的類和接口組成,使數(shù)據(jù)庫開發(fā)人員可以用標(biāo)準(zhǔn)JavaAPI編寫數(shù)據(jù)庫應(yīng)用程序。2連接池技術(shù)2.1連接池原理連接池技術(shù)的核心思想是:連接復(fù)用,通過建立一個數(shù)據(jù)庫連接池以及一套連接使用、分配、管理策略,使得該連接池中的連接可以得到高效、平安的復(fù)用,防止了數(shù)據(jù)庫連接頻繁建

4、立、關(guān)閉的開銷。另外,由于對JDB中的原始連接進(jìn)展了封裝,從而方便了數(shù)據(jù)庫應(yīng)用對于連接的使用特別是對于事務(wù)處理,進(jìn)步了開發(fā)效率,也正是因為這個封裝層的存在,隔離了應(yīng)用的本身的處理邏輯和詳細(xì)數(shù)據(jù)庫訪問邏輯,使應(yīng)用本身的復(fù)用成為可能。連接池主要由三局部組成如圖1所示:連接池的建立、連接池中連接的使用管理、連接池的關(guān)閉。下面就著重討論這三局部及連接池的配置問題。圖1連接池形式2.1.1連接池的建立應(yīng)用程序中建立的連接池其實是一個靜態(tài)的。所謂靜態(tài)連接池是指連接池中的連接在系統(tǒng)初始化時就已分配好,且不能隨意關(guān)閉連接。Java中提供了很多容器類可以方便的構(gòu)建連接池,如:Vetr、Stak、Servlet、

5、Bean等,通過讀取連接屬性文件nnetins.prperties與數(shù)據(jù)庫實例建立連接。在系統(tǒng)初始化時,根據(jù)相應(yīng)的配置創(chuàng)立連接并放置在連接池中,以便需要使用時能從連接池中獲取,這樣就可以防止連接隨意的建立、關(guān)閉造成的開銷。2.1.2連接池的管理連接池管理策略是連接池機(jī)制的核心。當(dāng)連接池建立后,如何對連接池中的連接進(jìn)展管理,解決好連接池內(nèi)連接的分配和釋放,對系統(tǒng)的性能有很大的影響。連接的合理分配、釋放可進(jìn)步連接的復(fù)用,降低了系統(tǒng)建立新連接的開銷,同時也加速了用戶的訪問速度。下面介紹連接池中連接的分配、釋放策略。連接池的分配、釋放策略對于有效復(fù)用連接非常重要,我們采用的方法是一個很有名的設(shè)計形式:

6、Refereneunting引用記數(shù)。該形式在復(fù)用資源方面應(yīng)用的非常廣泛,把該方法運(yùn)用到對于連接的分配釋放上,為每一個數(shù)據(jù)庫連接,保存一個引用記數(shù),用來記錄該連接的使用者的個數(shù)。詳細(xì)的實現(xiàn)方法是:當(dāng)客戶懇求數(shù)據(jù)庫連接時,首先查看連接池中是否有空閑連接指當(dāng)前沒有分配出去的連接。假如存在空閑連接,那么把連接分配給客戶并作相應(yīng)處理即標(biāo)記該連接為正在使用,引用計數(shù)加1。假如沒有空閑連接,那么查看當(dāng)前所開的連接數(shù)是不是已經(jīng)到達(dá)axnn最大連接數(shù),假如沒到達(dá)就重新創(chuàng)立一個連接給懇求的客戶;假如到達(dá)就按設(shè)定的axaitTie最大等待時間進(jìn)展等待,假如等待axaitTie后仍沒有空閑連接,就拋出無空閑連接的異

7、常給用戶。當(dāng)客戶釋放數(shù)據(jù)庫連接時,先判斷該連接的引用次數(shù)是否超過了規(guī)定值,假如超過就刪除該連接,并判斷當(dāng)前連接池內(nèi)總的連接數(shù)是否小于innn最小連接數(shù),假設(shè)小于就將連接池充滿;假如沒超過就將該連接標(biāo)記為開放狀態(tài),可供再次復(fù)用。可以看出正是這套策略保證了數(shù)據(jù)庫連接的有效復(fù)用,防止頻繁地建立、釋放連接所帶來的系統(tǒng)資源開銷。2.1.3連接池的關(guān)閉當(dāng)應(yīng)用程序退出時,應(yīng)關(guān)閉連接池,此時應(yīng)把在連接池建立時向數(shù)據(jù)庫申請的連接對象統(tǒng)一歸還給數(shù)據(jù)庫即關(guān)閉所有數(shù)據(jù)庫連接,這與連接池的建立正好是一個相反過程。2.1.4連接池的配置數(shù)據(jù)庫連接池中到底要放置多少個連接,才能使系統(tǒng)的性能更佳,用innn和axnn來限制。

8、innn是當(dāng)應(yīng)用啟動的時候連接池所創(chuàng)立的連接數(shù),假如過大啟動將變慢,但是啟動后響應(yīng)更快;假如過小啟動加快,但是最初使用的用戶將因為連接池中沒有足夠的連接不可防止的延緩了執(zhí)行速度。因此應(yīng)該在開發(fā)的過程中設(shè)定較小innn,而在實際應(yīng)用的中設(shè)定較大innn。axnn是連接池中的最大連接數(shù),可以通過反復(fù)試驗來確定此飽和點(diǎn)。為此在連接池類nnetinPl中參加兩個方法getAtiveSize和getpenSize,AtiveSize表示某一時間有多少連接正被使用,penSize表示連接池中有多少連接被翻開,反映了連接池使用的峰值。將這兩個值在日志信息中反響出來,innn的值應(yīng)該小于平均AtiveSize

9、,而axnn的值應(yīng)該在ativeSize和penSize之間。2.2連接池的關(guān)鍵技術(shù)2.2.1事務(wù)處理前面討論的是關(guān)于使用數(shù)據(jù)庫連接進(jìn)展普通的數(shù)據(jù)庫訪問。對于事務(wù)處理,情況就變得比擬復(fù)雜。因為事務(wù)本身要求原那么性的保證,此時就要求對于數(shù)據(jù)庫的操作符合All-All-Nthing原那么,即要么全部完成,要么什么都不做。假如簡單的采用上述的連接復(fù)用的策略,就會發(fā)生問題,因為沒有方法控制屬于同一個事務(wù)的多個數(shù)據(jù)庫操作方法的動作,可能這些數(shù)據(jù)庫操作是在多個連接上進(jìn)展的,并且這些連接可能被其他非事務(wù)方法復(fù)用。nnetin本身具有提供了對于事務(wù)的支持,可以通過設(shè)置nnetin的Autit屬性為false,

10、顯式的調(diào)用it或rllbak方法來實現(xiàn)。但是要平安、高效的進(jìn)展連接復(fù)用,就必須提供相應(yīng)的事務(wù)支持機(jī)制。方法是:采用顯式的事務(wù)支撐方法,每一個事務(wù)獨(dú)占一個連接。這種方法可以大大降低對于事務(wù)處理的復(fù)雜性,并且又不會阻礙連接的復(fù)用。連接收理效勞提供了顯式的事務(wù)開場、完畢it或rllbak聲明,以及一個事務(wù)注冊表,用于登記事務(wù)發(fā)起者和事務(wù)使用的連接的對應(yīng)關(guān)系,通過該表,使用事務(wù)的局部和連接收理局部就隔分開,因為該表是在運(yùn)行時根據(jù)實際的調(diào)用情況動態(tài)生成的。事務(wù)使用的連接在該事務(wù)運(yùn)行中不能被復(fù)用。在實現(xiàn)中,用戶標(biāo)識是通過使用者所在的線程來標(biāo)識的。后面的所有對于數(shù)據(jù)庫的訪問都是通過查找該注冊表,使用已經(jīng)分配

11、的連接來完成的。當(dāng)事務(wù)完畢時,從注冊表中刪除相應(yīng)表項。2.2.2封裝從上面的闡述可以看出,普通的數(shù)據(jù)庫方法和事務(wù)方法對于連接的使用分配、釋放是不同的,為了便于使用,對外提供一致的操作接口,我們對連接進(jìn)展了封裝:普通連接和事務(wù)連接,并利用了Java中的強(qiáng)大的面向?qū)ο筇匦裕憾鄳B(tài)。普通連接和事務(wù)連接均實現(xiàn)了一個Dbnnetin接口,對于接口中定義的方法,分別根據(jù)自己的特點(diǎn)作了不同的實現(xiàn),這樣在對于連接的處理上就非常的一致了。2.2.3并發(fā)為了使連接收理效勞有更大的通用性,我們必需要考慮到多線程環(huán)境,即并發(fā)問題。在一個多線程的環(huán)境下,必需要保證連接收理自身數(shù)據(jù)的一致性和連接內(nèi)部數(shù)據(jù)的一致性,在這方面J

12、ava提供很好的支持synhrnized關(guān)鍵字,這樣就很容易使連接收理成為線程平安的。2.2.4多數(shù)據(jù)庫效勞器在實際應(yīng)用中,應(yīng)用程序常常需要訪問多個不同的數(shù)據(jù)庫。如何通過同一個連接池訪問不同的數(shù)據(jù)庫,是應(yīng)用程序需要解決的一個核心問題。下面介紹一種解決的途徑:首先,定義一個數(shù)據(jù)庫連接池參數(shù)的類,定義了數(shù)據(jù)庫的JDB驅(qū)動程序類名,連接的URL以及用戶名口令等等一些信息,該類是用于初始化連接池的參數(shù):publilassnnetinParaipleentsSerializable/各初始化參數(shù)的定義其次是連接池的工廠類nnetinFatry,通過該類將一個連接池對象與一個名稱對應(yīng)起來,使用者通過該名稱

13、就可以獲取指定的連接池對象,實現(xiàn)的主要代碼如下:publilassnnetinFatrystatiHashtablennetinPls=/用來保存數(shù)據(jù)源名和連接池對象的關(guān)系publistatiDataSurelkup(StringdataSureNae)thrsNaeNtFundExeptin/查找名字為dataSureNae的數(shù)據(jù)源publistatiDataSurebind(Stringnae,nnetinParapara)thrsExeptin/將名字nae與使用para初始化的連接池對象綁定publistatividunbind(Stringnae)thrsNaeNtFundExept

14、in/將與名字nae綁定的連接池對象刪除3連接池應(yīng)用的實現(xiàn)一個完好的連接池應(yīng)用包括三個局部:DBnnetinPl類,負(fù)責(zé)從連接池獲取(或創(chuàng)立)連接、將連接返回給連接池、系統(tǒng)關(guān)閉時關(guān)閉所有連接釋放所有資源;DBnnetinanager類,負(fù)責(zé)裝載和注冊JDB驅(qū)動、根據(jù)屬性文件中定義的屬性創(chuàng)立DBnnetinPl、跟蹤應(yīng)用程序?qū)B接池的引用等;應(yīng)用程序?qū)B接池的使用。本文實現(xiàn)的數(shù)據(jù)庫連接池包括一個管理類DBnnetinanager,負(fù)責(zé)提供與多個連接池對象(DBnnetinPl類)之間的接口。每一個連接池對象管理一組封裝過的JDB連接對象nn,封裝過的JDB連接對象nn可以被任意數(shù)量的del層的組

15、件共享。類nn的設(shè)計很簡單,如下所示:lassnnPrivatejava.sgl.nnetinn;/數(shù)據(jù)庫連接對象PubliBleaninUse;/是否被使用PublilnglastAess;/最近一次釋放該連接的時間Publiintuseunt;/被使用次數(shù)下面是實現(xiàn)連接池的主要代碼:/初始化數(shù)據(jù)庫連接池publistatisynhrnizedvidFastInitPl()thrsExeptintrylass.frNae(driver);fr(inti=0;isize;i+)nnetinn=reatennetin();if(n!=null)addnnetin(n);/向連接池對象中添加數(shù)據(jù)庫

16、連接privatestatividaddnnetin(nnetinn)if(pl=null|pl1=null)pl=neVetr(size);pl1=neVetr(size);pl.addEleent(n);pl1.addEleent(false);/獲取數(shù)據(jù)庫連接publistatisynhrnizednnetingetnn()thrsExeptinnnetinnn=null;tryif(driver=null)FastInitPl();/獲得一個可用的(空閑的)連接.fr(inti=0;ipl.size();i+)nn=(nnetin)pl.eleentAt(i);if(pl1.eleen

17、tAt(i)=false)pl1.set(i,true);/Syste.ut.println(從連接池中獲取第+(i+1)+個空閑連接);returnnn;/假如沒有可用連接,且已有連接數(shù)小于最大連接數(shù)限制,那么創(chuàng)立并增加一個新連接到連接池nn=reatennetin();pl.addEleent(nn);pl1.addEleent(true);/Syste.ut.println(所有連接都在使用,在連接池中再創(chuàng)立一個新連接);ath(Exeptine)Syste.err.println(e.getessage();thrneExeptin(e.getessage();returnnn;/返回一個有效的新連接publinnetingetnnetin(StringstrDriver,StringstrUrl,StringstrUserNae,StringstrPassrd)thrsSQLExeptintrylass.frNae(strDriver);nn=Driveranager.getnnetin(strUrl,strUserNae,strPassrd);returnnn;4完畢語當(dāng)前eb應(yīng)用程序廣泛采用B/S構(gòu)造,其并發(fā)性決定了多用戶同時訪問數(shù)據(jù)庫的問題。本文闡述的基于JDB的數(shù)據(jù)庫連接池技術(shù)已成功應(yīng)用于基于eb的高職教學(xué)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論