Java框架研究與實(shí)現(xiàn)_第1頁
Java框架研究與實(shí)現(xiàn)_第2頁
Java框架研究與實(shí)現(xiàn)_第3頁
Java框架研究與實(shí)現(xiàn)_第4頁
Java框架研究與實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

天津科技大學(xué) 2014 屆 本科生 畢業(yè)論文 1 1 前言 1.1、課題研究的背景與意義 軟件系統(tǒng) 不斷地發(fā)展,直到今天可以說是非常復(fù)雜了,尤其是服務(wù)器端的軟件,所涉及到的知識(shí)、內(nèi)容和問題實(shí)在是太多太多啦,如果我們?nèi)家约河H力親為也不是十分現(xiàn)實(shí)的事情。在具有多個(gè)層次的軟件開發(fā)過程當(dāng)中,框架憑借著其可重用和易擴(kuò)展等諸多優(yōu)點(diǎn),并且軟件組件經(jīng)過了良好測(cè)試,已經(jīng)越來越受到開發(fā)人員的喜愛。從別的角度考慮選擇了運(yùn)用別人開發(fā)出來的框架,就相當(dāng)于是開發(fā)人員把基礎(chǔ)性的工 作交給了別人來做,自己避開了繁雜的代碼工程,只需要集中全部精力去完成核心的工作,那就是分析和構(gòu)建系統(tǒng)業(yè)務(wù) 邏輯的應(yīng)用 。以這個(gè)思想為基礎(chǔ),人們就將具有相同或相似類型的問題進(jìn)行抽象,把相似的開發(fā)思路和解決途徑抽象出來,提取得到一個(gè)應(yīng)用框架。 Java 語言具有可移植、跨平臺(tái)以及安全性等諸多的特性,應(yīng)用越來越廣泛,尤其是在網(wǎng)絡(luò)應(yīng)用中優(yōu)勢(shì)十分明顯。 Java 應(yīng)用程序框架有著什么樣的意義呢?現(xiàn)如今微軟的 Windows 操作系統(tǒng)一統(tǒng)桌面操作系統(tǒng)的天下,但是這并不能夠否認(rèn)其它桌面操作系統(tǒng)存在的事實(shí),比如 Linux 、 MAC OS 以及新興的 You、 Xin、eye OS 和 Ubuntu 等,其他操作系統(tǒng)的不斷發(fā)展會(huì)動(dòng)搖微軟的霸權(quán)地位 13??紤]到各個(gè)操作系統(tǒng)百家齊放的情況,人們都是隨意地挑選自己喜歡的操作系統(tǒng),不同的電腦上可能運(yùn)行著不同的操作系統(tǒng),而不同的操作系統(tǒng)又有著它們自己獨(dú)有的 API 函數(shù),這就意味著運(yùn)行在 Windows 操作系統(tǒng)上的應(yīng)用程序就不能在其他的系統(tǒng)上運(yùn)行,當(dāng)然了其它的也不能在 Windows 上運(yùn)行。開發(fā)應(yīng) 用程序就會(huì)需要去投入更多的財(cái)力和人力來開發(fā)出可以基于不同操作系統(tǒng)的同類型的程序。這種情況之下, Java 語言的“一次編譯,到處運(yùn)行”的特性就使得其成為開發(fā)桌面應(yīng)用程序的最佳選擇。 Java 語言為應(yīng)用程序提供的組件級(jí)支持具有強(qiáng)大功能,但是卻并不能提供像 MFC 的 doc/view 一樣的框架級(jí)的支持。如果是 C+程序員,利用 doc/view 很方便就可以開發(fā)出來一個(gè)桌面應(yīng)用程序,而如果 Java程序員想要開發(fā)一個(gè)類似的程序卻不得不從零開始。所以說 Java 應(yīng)用程序框架就顯得勢(shì)在必行, Java 框架的研究和應(yīng)用都會(huì)顯 得非常重要。 在進(jìn)行軟件開發(fā)的整個(gè)過程當(dāng)中,網(wǎng)絡(luò)連接、內(nèi)存、線程等一些稀有資源就可能需要對(duì)其進(jìn)行管理,如果這些資源使用不當(dāng),就會(huì)在時(shí)間上或者空間上極大地限制軟件的使用效率和性能。要想使得稀有資源得以充分利用,需要遵守的使用原則就是:盡最大可能去推遲資源的分配,然后盡最大可能去提前釋放資源。因此開發(fā)人員在軟件開發(fā)的過程中采用共享模式,在時(shí)間和空間上盡量去復(fù)用這些稀有資源。 計(jì)算機(jī)網(wǎng)絡(luò)的飛速發(fā)展使得人們更加高標(biāo)準(zhǔn)嚴(yán)要求地去進(jìn)行網(wǎng)絡(luò)資源的共天津科技大學(xué) 2014 屆 本科生 畢業(yè)論文 2 享。在基于 Java 語言并且需要進(jìn)行和數(shù)據(jù)庫有關(guān)操作的 Web 應(yīng)用開發(fā)當(dāng)中, 用戶對(duì)數(shù)據(jù)庫中數(shù)據(jù)的訪問必定是十分地頻繁。訪問數(shù)據(jù)就需要先建立數(shù)據(jù)庫連接,連接的建立會(huì)耗費(fèi)巨大的系統(tǒng)開銷,頻繁地進(jìn)行連接建立和關(guān)閉操作或者單單是不斷地去創(chuàng)建新的連接就已經(jīng)讓服務(wù)器難以承受。連接數(shù)量的失控也會(huì)降低服務(wù)器的性能,甚至?xí)斐煞?wù)器崩潰。這一切的問題都迫切需要引入一種高效率的資源管理機(jī)制來解決,數(shù)據(jù)庫連接池就及時(shí)的出現(xiàn)啦。 1.2、本文作的工作 本文首先從整體說起,介紹了框架的整體概念,框架開發(fā)應(yīng)用的特點(diǎn)與重要意義。然后對(duì)主要的 Java 框架進(jìn)行研究和介紹,主要包括 S2SH 框架、 JFreeChart、C3P0、 DBCP, 最終使用 MyEclipse 軟件實(shí)現(xiàn)了一個(gè)小型的 Java 框架 數(shù)據(jù)庫連接池。 其中重點(diǎn)介紹的是數(shù)據(jù)庫連接池的實(shí)現(xiàn),先從傳統(tǒng)的 JDBC 數(shù)據(jù)庫連接著手,介紹傳統(tǒng)模式的工作原理及其存在的缺陷,然后基于 JDBC 連接不斷對(duì)其進(jìn)行功能的優(yōu)化,最終得到高效資源管理的數(shù)據(jù)庫連接池。為了突出連接池的優(yōu)越性能,建立相同連接次數(shù),進(jìn)行相同的操作,比較兩種方式的時(shí)間代價(jià)。并且對(duì)連接池的部分優(yōu)化進(jìn)行測(cè)試,驗(yàn)證最大連接數(shù)、最大使用次數(shù)和 close 方法的攔截。 天津科技大學(xué) 2014 屆 本科生 畢業(yè)論文 3 2 Java 框架的研 究 2.1、框架概述 框架( Framework)是整個(gè)系統(tǒng)或部分系統(tǒng)為了實(shí)現(xiàn)可重用而形成的一種設(shè)計(jì),是實(shí)現(xiàn)抽象的 構(gòu)件 和構(gòu)件實(shí)例進(jìn)行交互的一種方法。框架可以說是一個(gè)半成品,只需再修改加工就可以成品,是可以供你選用然后完成你自己系統(tǒng)的一組 組件 ,可以把這個(gè)過程想象成你使用別人搭建好的一個(gè)舞臺(tái)來進(jìn)行表演。 同時(shí)框架一般情況下是比較成熟的,在不斷升級(jí)中的 軟件 。 選擇使用框架可以說是用“自由”去換取“方便”,系統(tǒng)的開發(fā)人員只需要也只能在框架所限制的要求以內(nèi)來完成一些業(yè)務(wù)組件,框架會(huì)統(tǒng)一管理這些組件并幫助相互之間進(jìn)行協(xié)調(diào) 1。在 Web 框架中,這種自由換方便的具體表現(xiàn)是:業(yè)務(wù)邏輯和顯示邏輯都要按照規(guī)則放置,然后按照要求去組織和配合,這種規(guī)則必須要遵守,而不能夠隨心所欲。當(dāng)然我們收獲的就是具有良好結(jié)構(gòu),可靠質(zhì)量的Web 應(yīng) 用。成熟、健壯的框架能夠把系統(tǒng)細(xì)枝末節(jié)的問題處理的很好,事務(wù)處理,安全性保證和數(shù)據(jù)流控制等一系列問題框架都可以解決。 可以為應(yīng)用程序的開發(fā)人員帶來很多的便利: (1)通過提供這么一個(gè)基礎(chǔ)設(shè)施,就能夠減輕開發(fā)人員代碼編寫,進(jìn)行測(cè)試以及反復(fù)調(diào)試的巨大工作量,而只用編寫、測(cè)試、調(diào)試基礎(chǔ)之上的特有的代碼,從而使得重復(fù)開發(fā)的巨大工作量大幅減少,開發(fā)的周期大幅縮短,開發(fā)成本也降低不少。 (2)以同一個(gè)框架為基礎(chǔ)創(chuàng)建的不同的應(yīng)用程序或系統(tǒng),它們具有相同的結(jié)構(gòu),這樣就便于相互之間的集成。同時(shí)相對(duì)于用不同設(shè)計(jì)方案創(chuàng)建 的應(yīng)用程序,框架的長處就是更加容易進(jìn)行維護(hù)。 (3)便于同一個(gè)項(xiàng)目中的工作人員進(jìn)行并行工作,約定俗成的規(guī)則可以讓他們配合的更加默契,也可以變向地縮短開發(fā)的周期。 (4)還有就是框架一般都是經(jīng)過很多人使用跟測(cè)試的,從而保證了好的結(jié)構(gòu)和更強(qiáng)的擴(kuò)展性,而且它還處在在不斷地升級(jí)過程中,升級(jí)的代碼可以給你帶來的源源不斷的便利。 2.2、軟件體系中框架的地位 框架一般情況下是處在低層次的應(yīng)用平臺(tái)(比如 J2EE)和高層次的業(yè)務(wù)邏輯之間的一個(gè) 軟件層 ,框架本身也是一個(gè)可以運(yùn)行的系統(tǒng)。設(shè)計(jì)文檔、接口、抽象類、組件還有類庫共同組成了框架。 5個(gè)要素之間的關(guān)系 14如圖 2-1所示。 天津科技大學(xué) 2014 屆 本科生 畢業(yè)論文 4 反映 實(shí)現(xiàn) 實(shí)現(xiàn) 繼承 組合 2.2.1、使用框架開發(fā)具有很多優(yōu)點(diǎn) 重用無疑會(huì)是框架提供的最大便利。 面向?qū)ο?系統(tǒng)所能盡最大可能去獲取到的復(fù)用的方式就是使用框架了,一個(gè)大型的應(yīng)用系統(tǒng)往往就是由多個(gè)層次通力協(xié)作的框架組合得到的??蚣苤詮囊延?組件 庫中選擇建立應(yīng)用會(huì)顯得那么容易,是因?yàn)榭蚣苣軌蛑赜么a,而且這些組件采用的都是框架統(tǒng)一定義的接口,就使得組件之間的通信變得十分簡(jiǎn)單。 框架可以對(duì)設(shè)計(jì)進(jìn)行重用。框架能都提供具有可重用功能的抽象的算法和更高層次的設(shè)計(jì),還 可以將大的系統(tǒng)進(jìn)行分解,得到更小的組件,同時(shí)可以描述組件之間的內(nèi)部接口。由于這些標(biāo)準(zhǔn)接口的存在,就可以在這個(gè)基礎(chǔ)之上通過組合建立各種各樣的系統(tǒng)。只要是能夠符合接口的規(guī)范,新的組件就能夠應(yīng)用到框架當(dāng)中,就可以重用組件的設(shè)計(jì)。 框架還可以對(duì)分析進(jìn)行重用。試想一下,所有的開發(fā)人員都能夠按照框架的思維來進(jìn)行分析,那樣就可以把框架進(jìn)行同樣的劃分,采用的解決方法也會(huì)是相似的,一個(gè)項(xiàng)目里的工作人員可以更加方便地進(jìn)行溝通。 框架開發(fā)使得領(lǐng)域之內(nèi)的軟件的結(jié)構(gòu)一致性更好;所建立的系統(tǒng)開放性更好;重用代碼的增多使得軟件的生產(chǎn)效率 提高,整體的質(zhì)量得到增強(qiáng);需求分析做得更加有條有理,軟件設(shè)計(jì)人員可以儲(chǔ)存更加豐富的經(jīng)驗(yàn);參數(shù)化的框架使得系統(tǒng)不管是適應(yīng)性還是靈活性都更好。 2.2.2、框架對(duì)軟件開發(fā)有著重要的意義 ( 1)積累知識(shí) 設(shè)計(jì)文檔 接口 抽象類 組件 類庫 圖 2-1 框架組成要素之間的關(guān)系 天津科技大學(xué) 2014 屆 本科生 畢業(yè)論文 5 框架的價(jià)值中最核心的是對(duì)知識(shí)的積累。雖說軟件開發(fā)是一項(xiàng)知識(shí)性的活動(dòng),但是知識(shí)存在的是人的大腦之中,對(duì)其進(jìn)行積累是很難進(jìn)行的。在軟件整個(gè)開發(fā)過程中,代碼是最確定的,計(jì)算機(jī)對(duì)于同一段代碼運(yùn)行之后只會(huì)得出一個(gè)相同的結(jié)果,不同的人理解也不會(huì)有所不同。所以對(duì)知識(shí)的積累要從對(duì)代碼的積累開始。而框架就是通過這種思維得到的,框架 之中包含有大量的代碼,這些代碼描述的是一定領(lǐng)域之中對(duì)某個(gè)特定問題的抽象概念以及這些抽象概念之間的關(guān)系。所以說框架能夠達(dá)到積累知識(shí)的目的。但是單純的代碼層次太低,如果開發(fā)人員只是通過代碼來理解框架,那也太困難太不現(xiàn)實(shí)了。所以要有設(shè)計(jì)文檔、UML 圖、模型等部件來幫助框架開發(fā)人員更加方便的理解代碼。 ( 2)保護(hù)資產(chǎn) 積累知識(shí)原本就屬于一項(xiàng)保護(hù)資產(chǎn)的工作,另外就是確保軟件組織(尤其對(duì)于企業(yè)來說)這些知識(shí)的學(xué)習(xí)都是經(jīng)過合法授權(quán)的。舉例來說,任何組織最不愿看到的都會(huì)是知識(shí)非法外流,把知識(shí)積累成框架的形式可以幫助解決這個(gè) 問題。框架可以選擇以源代碼的形式對(duì)外發(fā)布,以庫形式發(fā)布也是一個(gè)選擇,這樣不同種類的框架用戶就可以選擇不同的形式,可以達(dá)到權(quán)限控制的效果。 ( 3)鼓勵(lì)重用 重用對(duì)框架來說是特別注重的。在進(jìn)行軟件開發(fā)的過程中要把框架做為發(fā)開發(fā)方式中的核心,應(yīng)用框架,并根據(jù)現(xiàn)實(shí)情況的變化跟需要不斷對(duì)框架進(jìn)行改進(jìn)。重用在這個(gè)完善的過程中就發(fā)揮了它的作用。 ( 4)可以對(duì)架構(gòu)進(jìn)行優(yōu)化 框架之所以稱之為框架,正是因?yàn)樗鼘?shí)現(xiàn)了重用。與此同時(shí)框架代表的是一種優(yōu)秀的軟件架構(gòu)??蚣苁紫榷x了擴(kuò)展的方式,然后形成了使用的規(guī)范。這一切就是軟件開發(fā)保 持整體架構(gòu)穩(wěn)定性和一致性的重要保證。 2.3、當(dāng)前流行 Java 框架的簡(jiǎn)要介紹 1、 S2SH 框架 S2SH 是一個(gè)由 Struts 2+Spring+Hibernate 集合而成 的 Web 應(yīng)用程序 框架,是當(dāng)下被廣泛使用的一種開源的框架。 Struts 框架是由 Craig R.McClanahan 在 2000年設(shè)計(jì) 和開發(fā)的一種基于 J2EE 平臺(tái)同時(shí)實(shí)現(xiàn)了 MVC 設(shè)計(jì)模式的框架,采用面向?qū)ο蟮脑O(shè)計(jì)為 Java 社區(qū)提供了一個(gè)標(biāo)準(zhǔn)的、通用的 Web 應(yīng)用框架。 Struts 框架不僅兼有組件模塊化、靈活多變以及重用的優(yōu)勢(shì),而且使得開發(fā)采用 MVC 模式的 Web 應(yīng)用 程序 的過程得到了簡(jiǎn)化。 Struts 2是在 Struts 和 WebWork 技術(shù)的基礎(chǔ)之上通過合并而得到的一種全新的框架。 Struts 2與 Struts 在 體系結(jié)構(gòu) 上具有很大的差別, Struts 2的核心是WebWork,通過使用攔截器的機(jī)制來對(duì)用戶的請(qǐng)求進(jìn)行處理,這樣的操作使得業(yè)天津科技大學(xué) 2014 屆 本科生 畢業(yè)論文 6 務(wù)邏輯控制器完全擺脫 Servlet API 的束縛,因此從字面上看 Struts 2是 Struts 的升級(jí),而其實(shí)是 WebWork 升級(jí)后的產(chǎn)品。 Struts2框架的工作原 理 2如圖 2-2: ( 1)客戶端提交了一個(gè) HTTP 的請(qǐng)求,這個(gè)請(qǐng)求首先需要通過一些個(gè)過濾器,主要包含 ActionContextCleanUp、其他過濾器還有 FilterDispatcher 三層 Filter。 ( 2) FilterDispatcher 是控制器的核心所在,緊接著需要調(diào)用 FilterDispatcher 對(duì)ActionMapper 進(jìn)行詢問,由此來判定該請(qǐng)求有沒有調(diào)用 Action 的必要。 ( 3)如果需要去調(diào)用, FilterDispatcher 就把請(qǐng)求的處理權(quán)交給到 ActionProxy 手上, ActionProxy 會(huì)透過 Configuration Manager 和 Struts.xml 對(duì) 框架的配置文件進(jìn)行詢問,然后找到需要調(diào)用的 Action 類 。 (4)然后 ActionProxy 會(huì)實(shí)例化一個(gè) ActionInvocation,于此同時(shí) ActionInvocation HTTP 請(qǐng)求 ActionContextCleanUp 其他過濾器 FilterDispatcher ActionProxy Configuration Manager Struts.xml Action Invocation 攔截器 1 攔截器 3 攔截器 2 攔截器 3 Action Result 攔截器 2 攔截器 1 ActionMapper 標(biāo)簽庫 視圖模板、 JSP、 FreeMarker 等 HTTP 響應(yīng) 圖 2-2 Struts 2 的工作流程 天津科技大學(xué) 2014 屆 本科生 畢業(yè)論文 7 會(huì)通過代理模式的使用來調(diào)用 Action,在對(duì) Action 進(jìn)行調(diào)用的整個(gè)過程的前后,都會(huì)需要去調(diào)用相關(guān)的攔截器。 ( 5) Action 執(zhí)行完成以后, ActionInvocation 就會(huì)根據(jù) struts.xml 中的配置文件找到所需要的返回結(jié)果。這個(gè) 返回結(jié)果通常是一個(gè)需要被表示出來的 JSP 抑或是FreeMarker 的模版。在這個(gè)過程當(dāng)中還允許使用從 Struts 2框架中繼承來的標(biāo)簽。 Spring 是由 Rod Johnson 創(chuàng)建,源自于 Expert One-on-One J2EE 設(shè)計(jì)與開發(fā) 3一書中的代碼,從 2003年興起而來的一個(gè)開源的輕量級(jí) Java 開發(fā)框架,為的是降低企業(yè)級(jí)應(yīng)用開發(fā)的復(fù)雜性。通過使用基本的 JavaBean, Spring 完成了以前只可能由 EJB 完成的事情。更重要的是 Spring 的用途不僅僅局限于服務(wù)器端的開發(fā),從 易測(cè)試 、簡(jiǎn)單干凈、 低耦合 和便于管理的角度考慮問題,所有的 Java應(yīng)用都能夠從 Spring 框架的應(yīng)用中受益匪淺。 Hibernate 是由 Gavin King 開發(fā)出來的一個(gè)源代碼開放的 對(duì)象關(guān)系型數(shù)據(jù)映射 的框架, 它對(duì) JDBC 進(jìn)行了輕量級(jí)的對(duì)象封裝,在 Java 應(yīng)用和關(guān)系型數(shù)據(jù)庫之間架起了一條“橋梁”,把由對(duì)象模型表示出來的 Java 對(duì)象對(duì)應(yīng)到關(guān)系數(shù)據(jù)庫表中,使得 Java 的開發(fā)人員操控?cái)?shù)據(jù)庫的時(shí)候能夠自由地運(yùn)用對(duì)象 編程 的思維。 在任何使用 JDBC 的場(chǎng)合下都可以應(yīng)用 Hibernate,其中就包括在 Java 的客戶端程序中和在 Servlet/JSP 的 Web 應(yīng)用中的使用。除了對(duì) Java 對(duì)象到關(guān)系數(shù)據(jù)庫表的映射進(jìn)行管理之外, Hibernate 還提供了一些獲取數(shù)據(jù)和進(jìn)行數(shù)據(jù)查詢的方法,極大地減少了開發(fā)過程當(dāng)中人工使用 SQL 和 JDBC 對(duì)數(shù)據(jù)進(jìn)行處理所花費(fèi)的時(shí)間,非常成功地完成了數(shù)據(jù)持久化的目標(biāo)任務(wù)。 2、 JFreeChart JFreeChart 是運(yùn)用在 Java 平臺(tái)上的一個(gè)開放式的繪制圖表的類庫。它完全是由 Java 語言編寫而成的,是為了 applications、 applets、 servlets 以及 JSP 等的使用所設(shè)計(jì)的。 JFreeChart 可以用來生成餅狀圖( pie charts)、 時(shí)序圖 ( time series)、柱狀圖( bar charts)、 散點(diǎn)圖 ( scatter plots)、 甘特圖 ( Gantt charts)等一系列的圖表,并且可以產(chǎn)生 PNG 和 JPEG 格式 的圖像文件輸出,還可以關(guān)聯(lián)到 PDF 和Excel。具有性能穩(wěn)定、輕量級(jí)和功能強(qiáng)大的優(yōu)點(diǎn),是一種很好的 Java 圖形的解決方案,基本上能夠滿足圖形方面的需求。同時(shí) API 處理簡(jiǎn)單也就意味著用戶能夠輕松上手,生成的圖表運(yùn)行起來也會(huì)很流暢。 JFreeChart 存在的缺點(diǎn)就是單單適合圖片的生成,并且文字、圖片都不是那么的清晰,還會(huì)需要進(jìn)行一些調(diào)整,因此會(huì)顯得比較麻煩。 3、 C3P0 C3P0是一個(gè)開源了的 JDBC 連接池 ,它主要的功能是實(shí)現(xiàn)了數(shù)據(jù)源和JNDI(即 Java Naming and Directory Interface,也即 Java 命名和目錄接口 ) 15的捆綁,可以支持 JDBC3規(guī)范和 JDBC2規(guī)范標(biāo)準(zhǔn)的擴(kuò)展。 C3P0連接池的獨(dú)到之處就天津科技大學(xué) 2014 屆 本科生 畢業(yè)論文 8 是具有自動(dòng)回收空閑連接的功能,目前 Hibernate, Spring 等 開源項(xiàng)目 都使用的有 C3P0連接池。 4、 DBCP DBCP(DataBase Connection Pool,即 數(shù)據(jù)庫連接池 )屬于 Apache 上面一個(gè)Java 連接池的項(xiàng)目,同時(shí)也是應(yīng)用于 Tomcat 的一個(gè)連接池組件。在單獨(dú)使用DBCP 的時(shí)候還會(huì)需要有 3個(gè) Jar 包: commons-dbcp.jar、 commons-pool.jar 和commons-collections.jar。考慮到建立數(shù)據(jù)庫連接的操作是一個(gè)系統(tǒng)開銷大且費(fèi)時(shí)的行為,所以預(yù)先創(chuàng)建一些個(gè)數(shù)據(jù)庫連 接放到連接池中,儲(chǔ)存在內(nèi)存之中,應(yīng)用程序請(qǐng)求數(shù)據(jù)庫訪問需要建立數(shù)據(jù)庫連接的時(shí)候就直接到連接池中取一個(gè)連接,連接使用完畢以后還要放回到連接池中。與 C3P0連接池相比, DBCP 不具有自動(dòng)回收空閑連接的功能。 天津科技大學(xué) 2014 屆 本科生 畢業(yè)論文 9 3 數(shù)據(jù)庫連接池的實(shí)現(xiàn)原理 3.1、基于 JDBC 的傳統(tǒng)數(shù)據(jù)庫訪問機(jī)制 JDBC(Java Database Connectivity)也即 Java 數(shù)據(jù)庫連接,是一種由 Java 語言編寫的接口和 類組成的可以用于直接執(zhí)行 SQL(Structured Query Language)語句的 Java API。它是 J2SE 的一部分,主要功能為不同的關(guān)系型數(shù)據(jù)庫(如 MySQL、Oracle、 DB2、 SQL Server 等等)提供一致的訪問機(jī)制,通過 JDBC 可以訪問多種數(shù)據(jù)源 ,從關(guān)系型數(shù)據(jù)庫到文件系統(tǒng)都沒有問題。 JDBC 主要是由 Java.sql 和 Javax.sql 兩個(gè)包組成,其中 Java.sql 包提供了一組可以用來訪問和處理數(shù)據(jù)源中數(shù)據(jù)的 API;而 Javax.sql 包提供的是一組在服務(wù)器端可以用來訪問和處理數(shù) 據(jù)源的 API11。 JDBC 能夠?yàn)閿?shù)據(jù)庫的開發(fā)人員提供出來一個(gè)具有統(tǒng)一標(biāo)準(zhǔn)的 API(Application Programming Interface,就是應(yīng)用程序編程接口 ), JDBC 作為這樣一個(gè) 低級(jí) 的接口,就說明了它可以用來直接調(diào)用 SQL 命令。在這一方面它表現(xiàn)出了比其它的 數(shù)據(jù)庫 連接 API 更好的優(yōu)勢(shì) ,同時(shí)它也被設(shè)計(jì)成一種基礎(chǔ)接口,以此為基礎(chǔ)可以建立起來更加高級(jí)的接口還有工具。所謂的高級(jí)接口是 指用戶友好型的接口,它使用的是一種讓用戶更容易理解使用起來更為方便的 API,這種 API 在后臺(tái)然后再被轉(zhuǎn)換成類似 JDBC 這樣的低級(jí)接口,使得數(shù)據(jù)庫的分開發(fā)人員可以使用純的 Java API 來編寫數(shù)據(jù)庫應(yīng)用開發(fā)程序。 JDBC 的應(yīng)用使得向各種關(guān)系型數(shù)據(jù)庫發(fā)送 SQL 語句的操作變成一件容易的事。換句話說,有了 JDBC API,就不需要為訪問 MySQL 數(shù)據(jù)庫寫一個(gè)程序,為了訪問 Oracle 數(shù)據(jù)庫再專門寫一個(gè)程序,程序員就只需要使用 JDBC API編寫一個(gè)程序就可以通用了,它就可以向相對(duì)應(yīng)的數(shù)據(jù)庫發(fā)送 SQL 調(diào)用命令 12。 3.1.1、 JDBC 驅(qū)動(dòng)介紹 JDBC API 包含有兩種最主要的接口:一種是為應(yīng)用程序開發(fā)人員提供的API,另一種是為驅(qū)動(dòng)開發(fā)人員提供的驅(qū)動(dòng) API。這樣應(yīng)用程序就可以通過 JDBC API 使用 JDBC 技術(shù)的驅(qū)動(dòng)來訪問數(shù)據(jù)庫。 JDBC 包含有四種類型的驅(qū)動(dòng) 4: 類型一是 JDBC-ODBC 橋 +ODBC 驅(qū)動(dòng),如圖 3-1 左半邊所示,這樣的組合是通過 ODBC 驅(qū)動(dòng)提供了 JDBC 訪問。在大多數(shù)的情況之下 ODBC 二進(jìn)制碼是數(shù)據(jù)庫的客戶端庫,必須被加載到每一個(gè)正在使用 JDBC-ODBC 橋的客戶機(jī)。Sun 公司提供過一 個(gè) JDBC-ODBC 橋驅(qū)動(dòng) ,但是只是被作為實(shí)驗(yàn)性使用或是手邊實(shí)在沒有其它驅(qū)動(dòng)的情況下,才不得已使用這個(gè)驅(qū)動(dòng)。在實(shí)際的應(yīng)用過程中,這種驅(qū)動(dòng)是不會(huì)被使用的。 類型二是本地化的同時(shí)支持 Java 技術(shù)的 API,如圖 3-1 右半邊所示,這種類型二的驅(qū)動(dòng)就將 JDBC 進(jìn)行調(diào)用轉(zhuǎn)化,是特定的數(shù)據(jù)庫廠商自己開發(fā)的 API。需要注意的是,和橋驅(qū)動(dòng)一樣這種類型的驅(qū)動(dòng)也要求每臺(tái)客戶機(jī)都要把相應(yīng)的二進(jìn)天津科技大學(xué) 2014 屆 本科生 畢業(yè)論文 10 制碼加載進(jìn)來。 Java 應(yīng)用程序 JDBC API JDBC 驅(qū)動(dòng)管理器 或數(shù)據(jù)源對(duì)象 JDBC- ODBC 橋驅(qū)動(dòng) 非純 Java JDBC 驅(qū)動(dòng) ODBC 數(shù)據(jù)庫客戶庫 數(shù)據(jù)庫客戶庫 數(shù)據(jù)庫服務(wù)器 數(shù)據(jù)庫服務(wù)器 圖 3-1 JDBC 驅(qū)動(dòng)類型一和類型二 Java 應(yīng)用程序 JDBC API JDBC 驅(qū)動(dòng)管理器 或數(shù)據(jù)源對(duì)象 純 Java JDBC 驅(qū) 動(dòng) 純 Java JDBC 驅(qū)動(dòng) 數(shù)據(jù)庫服務(wù)器 數(shù)據(jù)庫中間件 數(shù)據(jù)庫服務(wù)器 圖 3-2 JDBC 驅(qū)動(dòng)類型三和類型四 天津科技大學(xué) 2014 屆 本科生 畢業(yè)論文 11 JDBC 驅(qū)動(dòng)類型一和類型二都不是基于純 Java JDBC 的驅(qū)動(dòng),它們存在一個(gè)共同的缺點(diǎn),那就是都需要在每臺(tái)客房機(jī)端加載相對(duì)應(yīng)的二進(jìn)制碼。所以在現(xiàn)實(shí)的應(yīng)用過程當(dāng)中,這兩種類型的驅(qū)動(dòng)都不是很經(jīng)常性的使用,特別是對(duì)于JDBC-ODBC 橋驅(qū)動(dòng)來說,它的性能甚至還不如特定數(shù)據(jù)庫廠商提供的驅(qū)動(dòng)好用。 類型三是直接連接到數(shù)據(jù)庫的純 Java 驅(qū)動(dòng),如圖 3-2 左半邊所示,類型三的驅(qū)動(dòng)是調(diào)用 JDBC 轉(zhuǎn)化成由數(shù)據(jù)庫管理系統(tǒng)直接使用的網(wǎng)絡(luò)協(xié)議,這樣就可以從客戶機(jī)直接調(diào)用數(shù)據(jù)庫管理系統(tǒng)的服務(wù)器,緊接著就是為內(nèi)部網(wǎng)的訪問提供了一個(gè)切實(shí)可行的解決方案。 類型四是純 Java 驅(qū)動(dòng),主要面向 的是數(shù)據(jù)庫的中間件,如圖 3-2 右半邊所示,這種類型的驅(qū)動(dòng)將 JDBC 調(diào)用轉(zhuǎn)化為中間件所使用的協(xié)議,然后這種協(xié)議又被中間件服務(wù)器轉(zhuǎn)化為數(shù)據(jù)庫管理系統(tǒng)所使用的協(xié)議。數(shù)據(jù)庫中間件可以為各種不同的數(shù)據(jù)庫提供連接服務(wù)。 3.1.2、 JDBC 具有的優(yōu)點(diǎn) JDBC 是所有基于 Java 的應(yīng)用中最常用的連接數(shù)據(jù)庫方法,基于優(yōu)點(diǎn)眾多: ( 1) JDBC 技術(shù)的使用使得業(yè)務(wù)邏輯不會(huì)受到任何特定架構(gòu)的束縛,能夠繼續(xù)使用已安裝的數(shù)據(jù)庫,能夠很方便地訪問信息,即使是這些信息存儲(chǔ)在不同的數(shù)據(jù)庫管理系統(tǒng)中也沒有問題。 ( 2)使用 Java API 和 JDBC API 能夠應(yīng)用程序的開發(fā)得到簡(jiǎn)化,使得開發(fā)得以更加方便高效地進(jìn)行。 JDBC 可以隱藏許多數(shù)據(jù)訪問的復(fù)雜工作,這樣一來大多數(shù)對(duì)于程序員而言十分困難的工作,都將由 JDBC 在后臺(tái)不知不覺中地完成,大量地減輕了程序員身上的重?fù)?dān)。 ( 3) JDBC API 的使用就使得客戶端完全不需要進(jìn)行任何的配置。使用由Java 語言編寫的驅(qū)動(dòng) ,使得在構(gòu)建數(shù)據(jù)庫連接時(shí)需要的所有的信息,將完全由JDBC URL 或者由 JNDI 注冊(cè)在命名服務(wù)中的數(shù)據(jù)源的對(duì)象來操作完成。 JNDI為程序開發(fā)人員提供了查找與訪問各種各樣命名、目錄的統(tǒng)一的接 口,通過一個(gè)名稱就可以查找到所需要的對(duì)象。 3.1.3、 JDBC 存在的一些弊端 在使用 Java 語言開發(fā)的基于數(shù)據(jù)庫的 Web 應(yīng)用中,一般情況下都會(huì)使用JDBC 來連接數(shù)據(jù)庫進(jìn)行交互。 Java 傳統(tǒng)模式訪問數(shù)據(jù)庫時(shí)需要以下步驟:首先需要注冊(cè)所使用數(shù)據(jù)庫的驅(qū)動(dòng)程序,然后在主程序中通過 JDBC 搭建起數(shù)據(jù)庫連接,緊接著執(zhí)行 SQL 語句進(jìn)行增刪改查操作,最后連接使用完之后要關(guān)閉數(shù)據(jù)庫連接釋放占有的資源。對(duì)于小型的 Web 應(yīng)用來說,對(duì)數(shù)據(jù)庫的訪問不會(huì)特別的頻繁,使用這種傳統(tǒng)的方式還勉強(qiáng)可以接受;但是如果對(duì)于大型的 Web 應(yīng)用,這種 方式就會(huì)暴露出一系列的漏洞: 天津科技大學(xué) 2014 屆 本科生 畢業(yè)論文 12 ( 1) 用戶每一次發(fā)送 Web 訪問請(qǐng)求都需要建立新的數(shù)據(jù)庫連接,而大型Web 應(yīng)用需要非常頻繁地建立和關(guān)閉數(shù)據(jù)庫連接。建立數(shù)據(jù)庫連接不僅需要占用系統(tǒng)的通訊和內(nèi)存資源,而且大多還需要驗(yàn)證用戶和安全上下文( Context) 配置這些任務(wù),占用和消耗了一次訪問大多數(shù)的資源和時(shí)間,頻繁的進(jìn)行操作會(huì)大大地加重了系統(tǒng)的負(fù)擔(dān),并且還會(huì)降低數(shù)據(jù)庫服務(wù)器的性能。 ( 2) 對(duì)于每一次建立的數(shù)據(jù)庫連接,使用完畢之后必須要斷開連接。如果程序出現(xiàn)異?;蛘呤遣僮鞒霈F(xiàn)問題而導(dǎo)致某一些連接不能正常地關(guān)閉 ,這會(huì)導(dǎo)致數(shù)據(jù)庫系統(tǒng)中的內(nèi)存 出現(xiàn)泄露 ,還有可能導(dǎo)致系統(tǒng)崩潰,最終的結(jié)果極有可能是被迫重啟數(shù)據(jù)庫來恢復(fù)系統(tǒng)。所以必須要對(duì)每一次的數(shù)據(jù)庫連接進(jìn)行管理 ,以確保它們能夠被正常地關(guān)閉,但是這一切對(duì)于程序員來說顯然是極難實(shí)現(xiàn)的。 ( 3) 這種傳統(tǒng)模式不能夠控制被創(chuàng)建的連接數(shù)量,系統(tǒng)的資源就會(huì)被毫無保留地分配出去,如果建立的連接數(shù)過多就很可能會(huì)導(dǎo)致系統(tǒng)內(nèi)存泄露,進(jìn)而可能造成服務(wù)器的全面崩潰。在與數(shù)據(jù)庫相關(guān)聯(lián)的 Web 應(yīng)用中,建立數(shù)據(jù)庫連接是既費(fèi)時(shí)費(fèi)力又代價(jià)巨大的操作,頻繁地建立連接和關(guān)閉連接會(huì)造成很大的性能開銷,就會(huì)影響到整個(gè)系統(tǒng)的效率,這通常就是限制網(wǎng)站速 度的瓶頸因素。 很顯然,使用傳統(tǒng)的的模式來實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的連接訪問可以說已經(jīng)遠(yuǎn)不能滿足實(shí)際的需求了,因此就要求必須做出改進(jìn)。比較有效合理的對(duì)策就是對(duì)數(shù)據(jù)庫連接進(jìn)行復(fù)用從而實(shí)現(xiàn)共享,那就是建立一個(gè)更加高效的資源管理機(jī)制 數(shù)據(jù)庫連接池。通過數(shù)據(jù)庫連接池可以提供出來有效的連接、分配和使用的策略,一方面提供快速、合理并且有效的連接服務(wù),另一方面又可以避免頻繁的建立關(guān)閉連接所帶來的巨大系統(tǒng)開銷。 3.2、數(shù)據(jù)庫連接池的原理 連接池顧名思義就是“緩沖存儲(chǔ)池”,也即連接對(duì)象的集合。其最基本的思想是:復(fù)用建立的連接,建立一 個(gè)數(shù)據(jù)庫連接池,采用一套完整的連接的使用、分配以及管理的策略,以此來保證這個(gè)連接池中存放的連接能夠獲得高效率并且安全性高的復(fù)用,從而避免數(shù)據(jù)庫連接被頻繁建立和關(guān)閉所帶來的巨大的系統(tǒng)開銷。除此之外,由于對(duì) JDBC 中原始的連接進(jìn)行了封裝的處理,更加便于數(shù)據(jù)庫應(yīng)用(特別是對(duì)于事務(wù)處理來說)來使用連接,極大地提高了開發(fā)的效率,此時(shí)正是由于這個(gè)封裝層的運(yùn)用,劃清了數(shù)據(jù)庫應(yīng)用自身的處理邏輯和具體的數(shù)據(jù)庫訪問邏輯之間的界限,使得數(shù)據(jù)庫應(yīng)用本身得以成功復(fù)用 7。 當(dāng)一個(gè)用戶向數(shù)據(jù)庫提出訪問請(qǐng)求時(shí),數(shù)據(jù)庫連接池就會(huì)從池 中分配一個(gè)數(shù)據(jù)庫連接給該用戶使用;當(dāng)該用戶數(shù)據(jù)庫訪問結(jié)束的時(shí)候,他被分配使用的連接將被重新放回到連接池中,以供他人繼續(xù)使用而不是被銷毀,同時(shí)連接的創(chuàng)建與關(guān)閉都是由連接池自身來進(jìn)行管理的。數(shù)據(jù)庫連接池最初的模型 6如圖 3-3 所示。 天津科技大學(xué) 2014 屆 本科生 畢業(yè)論文 13 取得連接 放回連接 連接池最主要由連接池的建立、連接池中連接的使用和管理以及連接池的關(guān)閉三個(gè)環(huán)節(jié)組成。 1、連接 池的建立 應(yīng)用程序中建立的連接池大多都屬于是靜態(tài)的。靜態(tài)的連接池指的就是連接池當(dāng)中存放的連接是在系統(tǒng)初始化的時(shí)候就已經(jīng)創(chuàng)建好的,并且不允許隨意地關(guān)閉。 Java 有許多容器類都可以非常方便地實(shí)現(xiàn)連接池的功能,例如: Stack、Servlet、 Vector、 JavaBean 等等。在系統(tǒng)進(jìn)行初始化的時(shí)候,需要根據(jù)與之相應(yīng)的配置文件創(chuàng)建一些連接放置到連接池中,以便需要使用連接時(shí)能夠從連接池中及時(shí)地獲取,這樣做就可以降低頻繁地建立和關(guān)閉連接所造成的巨大系統(tǒng)開銷。 在實(shí)際的實(shí)現(xiàn)過程中 ,通常是把數(shù)據(jù)庫連接作為一個(gè)對(duì)象存 儲(chǔ)在這些容器類對(duì)象中 (即連接池 )。一般說來,一個(gè)數(shù)據(jù)庫連接池應(yīng)該具備以下一些功能: (1)能夠存儲(chǔ)若干個(gè)有效的連接; (2)可以驗(yàn)證連接是否正常; (3)對(duì)于一個(gè)數(shù)據(jù)庫訪問請(qǐng)求 ,能夠直接從連接池中獲得一個(gè)連接; (4)如果數(shù)據(jù)庫連接池當(dāng)前不存在空閑的連接,同時(shí)當(dāng)前連接數(shù)還沒有達(dá)到預(yù)先設(shè)置的最大連接數(shù),就可以再創(chuàng)建新的數(shù)據(jù)庫連接來使用; (5)能夠取回使用過的連接; (6)連接池關(guān)閉時(shí)能夠關(guān)閉池中所有的連接。 2、連接池的管理 連接池 Servelt, JavaBea, SQL 操作 圖 3-3 連接池模型 天津科技大學(xué) 2014 屆 本科生 畢業(yè)論文 14 連接池的管理策略就是連接池機(jī)制的核心所在。連接池建立成功了之后,怎樣對(duì)連接池中存放 的連接進(jìn)行管理,怎樣去處理好連接的分配與釋放,這些都是對(duì)系統(tǒng)的性能有著重大影響的關(guān)鍵問題。通常的情況之下連接池中會(huì)分有空閑的隊(duì)列和已分配出去的隊(duì)列,空閑隊(duì)列中存放的是未分配出去的連接,已分配出去的隊(duì)列中存放正在被占用著的連接。連接的合理分配與及時(shí)釋放都能夠提高連接的復(fù)用效果,不僅能夠降低系統(tǒng)不斷建立新連接的巨大開銷,同時(shí)也會(huì)加快用戶進(jìn)行訪問的速度。 連接池的分配、釋放策略對(duì)于連接的有效復(fù)用可以說是至關(guān)的重要,我們采用一個(gè)常用的設(shè)計(jì)模式 16: Reference Counting(引用記數(shù))。這個(gè)設(shè)計(jì)模式在 復(fù)用資源方面的運(yùn)用都非常的廣泛,因此可以把這種思維運(yùn)用到連接資源的分配與釋放上面,讓每一個(gè)數(shù)據(jù)庫連接都對(duì)應(yīng)于一個(gè)引用記數(shù),目的是記錄連接使用的數(shù)量。 當(dāng)用戶發(fā)出數(shù)據(jù)庫連接請(qǐng)求時(shí),首先要查看連接池當(dāng)前是否存在有空閑著的連接(指的是當(dāng)前還沒有被分配出去的等待分配的連接)。如果存在就把連接分配給用戶并把這個(gè)連接標(biāo)記成分配狀態(tài),同時(shí)引用計(jì)數(shù)要加 1,并且注冊(cè)到已分配隊(duì)列之中。若連接池中當(dāng)前不存在空閑的連接,則先查看該連接池的連接數(shù)是否已經(jīng)達(dá)到設(shè)定的最大連接數(shù) maxCount,如果還沒有達(dá)到就創(chuàng)建一個(gè)新的連接給請(qǐng)求訪 問的用戶并設(shè)置其為已分配狀態(tài)即可 ;如果當(dāng)前連接數(shù)已經(jīng)達(dá)到了最大連接數(shù)就只能等待其它線程釋放連接以后才可以獲取連接,這個(gè)等待過程就按照設(shè)定的最大等待時(shí)間進(jìn)行等待,如果等待設(shè)定的時(shí)間之后池中仍然沒有出現(xiàn)空閑的連接,就拋出無空閑連接的警告信息給用戶說明此次請(qǐng)求無效。 當(dāng)用戶要釋放數(shù)據(jù)庫連接時(shí),先判斷該連接的引用記數(shù)是否超過了預(yù)先設(shè)定的最大值,如果已經(jīng)超過就徹底刪除該連接,然后需要判斷當(dāng)前連接池內(nèi)存在的總的連接數(shù)量是否小于連接池的初始化連接數(shù) initCount,若小于就創(chuàng)建新的連接填充連接池;如果沒有超過規(guī)定的 最大使用次數(shù)就把連接重新放回到連接池中,等待連接的線程就可以獲取連接進(jìn)行再次復(fù)用。 3、連接池的關(guān)閉 退出應(yīng)用程序的時(shí)侯,需要把連接池關(guān)閉,這就要求把連接池建立之時(shí)申請(qǐng)的連接對(duì)象統(tǒng)統(tǒng)歸還給數(shù)據(jù)庫,也即關(guān)閉所有建立的數(shù)據(jù)庫連接,這個(gè)過程與連接池的建立的過程正好是一個(gè)逆向的過程。 3.3、連接池幾個(gè)關(guān)鍵技術(shù)的介紹 在 Web 應(yīng)用開發(fā)的過程中,為了保證數(shù)據(jù)庫連接復(fù)用高效和安全的實(shí)現(xiàn),下面的幾個(gè)關(guān)鍵技術(shù)將會(huì)起到舉足輕重的作用。 1、連接池大小的確定。在創(chuàng)建數(shù)據(jù)庫連接池時(shí),池中到底應(yīng)該放置多少數(shù)量的連接,才能夠使得系統(tǒng) 的性能達(dá)到最佳狀態(tài)呢?系統(tǒng)可以通過采取設(shè)置和調(diào)天津科技大學(xué) 2014 屆 本科生 畢業(yè)論文 15 整初始化連接數(shù)與最大連接數(shù)的方法來對(duì)連接池中連接的數(shù)量進(jìn)行控制。初始化連接數(shù)顧名思義就是系統(tǒng)啟動(dòng)之時(shí)連接池所創(chuàng)建的連接的數(shù)量。為了確保連接池中的初始化連接數(shù)所采取的策略分為動(dòng)態(tài)和靜態(tài)兩種策略。動(dòng)態(tài)的策略是每隔一段時(shí)間才會(huì)對(duì)連接池進(jìn)行檢查,一旦發(fā)現(xiàn)池中連接的數(shù)量小于初始化連接數(shù),就創(chuàng)建相應(yīng)數(shù)量的新的連接放進(jìn)去,以此確保連接池的正常運(yùn)轉(zhuǎn)所需的連接數(shù)。靜態(tài)的策略是等到空閑連接不夠用的時(shí)侯才去檢查。而最大連接數(shù)是連接池中設(shè)定的允許創(chuàng)建連接的最大數(shù)量,具體值設(shè)置為多少,就 要看系統(tǒng)的訪問量而定,需要通過反復(fù)進(jìn)行測(cè)試,來找到最佳點(diǎn)。一般的策略是:首先設(shè)置一個(gè)相對(duì)較大的連接池,然后再逐步減少它的大小來尋求這個(gè)最佳點(diǎn),通常情況下以 CPU 的占用率在 75%到 85%之間同時(shí)用戶負(fù)載正常為宜。 2、事務(wù)處理。事務(wù)是應(yīng)用程序當(dāng)中一系列嚴(yán)密的操作,所有的操作都必須遵循 All-All-Nothing的原則,即所有的操作必須成功完成,否則在每個(gè)操作中所作的所有更改就都會(huì)被依次撤銷。事務(wù)的原子特性要求一個(gè)事務(wù)中進(jìn)行的一系列操作要么全部都成功完成,要么一個(gè)都不能做,不能是一個(gè)半吊子。在 Java語言 中, Connection 類自身就支持事務(wù),可以把 Connection 的屬性 AutoCommit設(shè)置成 false,然后再通過調(diào)用 commit 或 rollback 來實(shí)現(xiàn)。要是簡(jiǎn)單的使用復(fù)用連接的策略,會(huì)出現(xiàn)一系列的問題,因?yàn)槲覀儧]有辦法去控制屬于同一個(gè)事務(wù)的多個(gè)不同數(shù)據(jù)庫操作方法,有可能這些數(shù)據(jù)庫操作是在多個(gè)不同連接上來進(jìn)行的,并且這些連接還存在有被其他非事務(wù)的方法復(fù)用的可能性。但是如果想要更加高效安全地進(jìn)行連接復(fù)用,就必須提供支持事務(wù)的機(jī)制。具體表現(xiàn)為:使用顯式的事務(wù)支持的方法,每一個(gè)事務(wù)占用一個(gè)連接。這種獨(dú)占 連接的方式可以降低事務(wù)處理的復(fù)雜程度,并且不會(huì)對(duì)連接的復(fù)用造成任何影響。 3、封裝。從上面的論述我們不難看出,考慮連接分配和釋放,一般的數(shù)據(jù)庫方法跟事務(wù)處理的方法是不一樣的,為了便于使用接口,我們把事務(wù)連接和普通連接進(jìn)行了封裝。并且利用了 Java 中面向?qū)ο笤O(shè)計(jì)的多態(tài)特性,把普通的連接和事務(wù)連接都實(shí)現(xiàn)了一個(gè) Connection 接口,至于接口中方法的定義,就需要根據(jù)自己具體的特點(diǎn)然后做出不同的實(shí)現(xiàn),對(duì)連接采取這樣的處理上就顯得非常的一致。 4、并發(fā)。為了使連接的管理具有更加強(qiáng)大的通用性,多線程環(huán)境的復(fù)雜情況就必須考慮其中,也就是考慮并發(fā)的問題。對(duì)于多線程的環(huán)境,必須要考慮的問題就是連接管理自身數(shù)據(jù)一致性和連接內(nèi)部數(shù)據(jù)一致性的保證。 Java 在這方面就可以提供很好的技術(shù)支持,可以通過加鎖(通過函數(shù) synchronized 來實(shí)現(xiàn))來控制訪問的順序,由此就可以保證連接管理的線程安全。 5、實(shí)現(xiàn)多個(gè)數(shù)據(jù)庫服務(wù)器的連接。在實(shí)際的應(yīng)用過程中,應(yīng)用程序不會(huì)僅僅局限于使用一個(gè)數(shù)據(jù)庫,通常情況下都會(huì)需要去訪問多個(gè)不同的數(shù)據(jù)庫。所以天津科技大學(xué) 2014 屆 本科生 畢業(yè)論文 16 怎樣能夠使用同一個(gè)連接池去對(duì)不同的數(shù)據(jù)庫進(jìn)行訪問,是需要解決的問題核心。通常情況下可以采取的方法是 :通過設(shè)置一個(gè)連接池管理服務(wù)器來專門用于連接池的管理工作,這個(gè)管理器應(yīng)該具有以下的功能: (1)可以根據(jù)初始設(shè)置的不同創(chuàng)建出不同的連接池; (2)能夠存儲(chǔ)多個(gè)不同的連接池,不同的連接池中存儲(chǔ)不同功能的連接; (3)可以根據(jù)請(qǐng)求的不同向用戶提供不同連接池中的連接; (4)能夠把使用完的連接放回到與之相應(yīng)的連接池中去; (5)應(yīng)用程序關(guān)閉之后能夠釋放所有連接池中的連接。 天津科技大學(xué) 2014 屆 本科生 畢業(yè)論文 17 4 數(shù)據(jù)庫連接池的具體實(shí)現(xiàn) 4.1、通過 JDBC 建立數(shù)據(jù)庫連接的實(shí)現(xiàn)過程 4.1.1、 JDBC 連接數(shù)據(jù)庫的最基本步驟 : 圖 4-1 JDBC 建立數(shù)據(jù)庫連接的基本步驟 如上圖 4-1 是 JDBC 建立數(shù)據(jù)庫連接的基本步驟 8,主要包含下面 6 個(gè)步驟。 ( 1)注冊(cè)驅(qū)動(dòng) 。 以上兩種方式是比較常用的注冊(cè)驅(qū)動(dòng)的方法,第二 種方式是先根據(jù)類的名字把類裝載到虛擬機(jī)中,然后需要調(diào)用靜態(tài)代碼塊把驅(qū)動(dòng)類放入到由 DriverManager 管理的驅(qū)動(dòng)列表中;第一種方式是創(chuàng)建了類的實(shí)例。兩種方式比較起來,前者比較依賴 MySQL 驅(qū)動(dòng),一旦離開將不能通過編譯;后者則顯得更加靈活。因此在開發(fā)過程中大多選擇第二種方式進(jìn)行驅(qū)動(dòng)的注冊(cè)。 ( 2)建立連接 。 url用于找到相應(yīng)的數(shù)據(jù)庫 , 而用戶名和密碼是對(duì)用戶訪問的權(quán)限進(jìn)行設(shè)置。有了 url,用戶名和密碼就可以通過 DriverManager建立起連接。 ( 3)創(chuàng)建語句 。 連接建立起來以后,就要?jiǎng)?chuàng)建語句。如果把連 接比作一個(gè)橋梁的話,那么此處創(chuàng)建的語句就好比是一輛貨車,必須通過連接這座橋梁才能夠到達(dá)對(duì)岸運(yùn)送貨物。運(yùn)送的是 SQL語句,然后可以把所需的結(jié)果運(yùn)回。 ( 4) 執(zhí)行 SQL語句,得到所需的結(jié)果集。這個(gè)過程就好像是貨車從河對(duì)岸天津科技大學(xué) 2014 屆 本科生 畢業(yè)論文 18 運(yùn)回了我們想要的貨物。 ( 5)結(jié)果處理 。 把結(jié)果集中的結(jié)果打印出來,按行讀取,然后每一行是按列讀取。這個(gè)過程就好像是按照一定的順序把運(yùn)回的貨物卸下了貨車。 ( 6)釋放占有的資源 。 資源釋放的順序和建立時(shí)的順序正好相反。這個(gè)過程就好比我們從學(xué)校外面回宿舍,先進(jìn)的是學(xué)校大門,然后進(jìn)宿舍門;出去的時(shí)候就是 要先出宿舍門,然后才是出校門。 以上 只 是個(gè)簡(jiǎn)單的過程,還存在著一些問題,比如驅(qū)動(dòng)的注冊(cè)只需要做一次就好了,如果把上面過程當(dāng)做一個(gè)連接模板,那么每創(chuàng)建一次連接就會(huì)注冊(cè)一次,顯然不太合理。連接的建立包含參數(shù) url、用戶名和密碼,如果涉及到參數(shù)的修改,程序內(nèi)部所涉及到的地方就會(huì)都需要修改,如果沒有全部修改,還會(huì)出現(xiàn)錯(cuò)誤,因此會(huì)顯得非常麻煩。 4.1.2、對(duì)基本 JDBC 連接的優(yōu)化 下面就將對(duì)上面的 JDBC連接過程進(jìn)行優(yōu)化,解決上面提到的一系列問題。解決的思想就是面向?qū)ο蠓庋b的思想,把煩雜的操作都給封裝起來,以使得連 接操作更加嚴(yán)謹(jǐn)合理。這里可以通過創(chuàng)建一個(gè)工具類 Utils,來把注冊(cè)驅(qū)動(dòng)、建立連接和關(guān)閉連接幾個(gè)步驟封裝起來 10。 下圖 4-2是工具類 Utils的主要代碼: 圖 4-2 工具類 Utils 的主要代碼 天津科技大學(xué) 2014 屆 本科生 畢業(yè)論文 19 首先工具類 Utils的創(chuàng)建不是為了用于繼承,所以就禁止掉繼承;構(gòu)造方法采用的是私有的方法限制實(shí)例的構(gòu)造; url、用戶名和密碼這些屬性都定義為私有,這樣自己修改就不會(huì)影響到別人創(chuàng)建連接的操作。其次把加載驅(qū)動(dòng)這部分放到了靜態(tài)代碼塊中,就使得驅(qū)動(dòng)的注冊(cè)只會(huì)做一次。 try 和 catch的使用保護(hù)驅(qū)動(dòng)注冊(cè)的順利進(jìn)行,否則就會(huì)拋出初始化的錯(cuò)誤。最后是連接的關(guān)閉, try, finally保證無論發(fā)生任何異常,連接都可以正常關(guān)閉。 Utils工具類創(chuàng)建完成之后,連接的過程就變得簡(jiǎn)單了 9。 下圖 4-3是部分操作封裝到 Utils工具類 以后的連接過程 。 圖 4-3 封裝后的連接過程 天津科技大學(xué) 2014 屆 本科生 畢業(yè)論文 20 圖 4-4 MySQL中的 xinke表數(shù)據(jù) 圖 4-5 連接建立成功獲取數(shù)據(jù)庫數(shù)據(jù) 天津科技大學(xué) 2014 屆 本科生 畢業(yè)論文 21 然后在 MySQL數(shù)據(jù)庫中插入數(shù)據(jù) 17,如圖 4-4顯示的是 MySQL數(shù)據(jù)庫中 tust下一個(gè) xinke 表的數(shù)據(jù),建立連接對(duì)其執(zhí)行查詢操作,檢驗(yàn)連接建立是否成功。由圖 4-5可以看到連接建立并成功獲取數(shù)據(jù)。 4.2、優(yōu)化與測(cè)試 4.2.1、耗時(shí)比較 測(cè)試 JDBC連接建立 和 關(guān)閉循環(huán) 100次的時(shí)間代價(jià)。 圖 4-6 耗時(shí)測(cè)試代碼 圖 4-7 JDBC 連接 100次耗時(shí)測(cè)試 結(jié)果 天津科技大學(xué) 2014 屆 本科生 畢業(yè)論文 22 圖 4-6是建立 100次連接耗時(shí)測(cè)試的代碼, 圖 4-7是 JDBC連接 100次耗時(shí)測(cè)試結(jié)果。 JDBC建立的每一個(gè)連接都是使用之后直接關(guān)閉,因此每一個(gè)連接都不一樣,連接 100次花費(fèi)時(shí)間為 893ms。 接下來要著手?jǐn)?shù)據(jù)庫連接池的建立。連接池的核心思想就是要實(shí)現(xiàn)對(duì)連接的復(fù)用,這里建立一個(gè)集合,存放 一些連接,然后需要使用連接就從集合中取一個(gè),用完之后再放回到集合中,以供他人使用??紤]到集合中的連接需要頻繁的插入和刪除,因此這個(gè)集合就用鏈表來實(shí)現(xiàn)。首先初始化一個(gè)鏈表,建立部分連接放入鏈表,需要連接的時(shí)候就從鏈表首部取一個(gè),使用完之后插入到鏈表尾部。 下圖 4-8是通過構(gòu)建數(shù)據(jù)源存放連接建立起連接池的代碼。 圖 4-8 數(shù)據(jù)庫連接池的構(gòu)建代碼 天津科技大學(xué) 2014 屆 本科生 畢業(yè)論文 23 圖 4-9 數(shù)據(jù)庫連接池 連接 100次耗時(shí)測(cè)試 結(jié)果 如圖 4-9,以上連接的建立都是按照順序獲取和釋放,因此對(duì)于初始化的 5個(gè)連接來說,創(chuàng)建的 100個(gè)連接就是每隔 5個(gè) 都一模一樣。跟 JDBC連接的 100次相比,進(jìn)行了相同的操作,但是耗時(shí)卻只有 323ms,因此說數(shù)據(jù)庫連接池的優(yōu)勢(shì)就顯而易見啦! 4.2.2、并發(fā)的控制 但是在現(xiàn)實(shí)的 Web應(yīng)用之中,線程的并發(fā)操作非常常見,因此就要考慮幾個(gè)線程并發(fā)操作來獲取連接的情況,如何才能避免沖突,保證每個(gè)線程取到不同的連接?同時(shí)要考慮到連接數(shù)量的問題,當(dāng)有連接請(qǐng)求時(shí)池中是否還有連接,如果沒有是否需要?jiǎng)?chuàng)建新的連接?這一系列問題都需要去解決,因此需要數(shù)據(jù)源LinkedlistDataSource進(jìn)行優(yōu)化 18。通過對(duì)連接訪問加鎖,來控制線程 的有序訪問;通過設(shè)置初始化連接數(shù) initCount 、最大連接數(shù) maxCount 和當(dāng)前連接數(shù)currentCount來對(duì)連接數(shù)量進(jìn)行控制。 天津科技大學(xué) 2014 屆 本科生 畢業(yè)論文 24 圖 4-10 連接池大小控制 如上 圖 4-10是連接池大小控制的 程序代碼, synchronized保證了連接的分配是串行進(jìn)行的,也就是先來先服務(wù);獲取連接時(shí)首先判斷池中是否存在著空閑連接(也就是通過判斷鏈表 LinkedlistSet是否為空),如果存在就從鏈表首部取一個(gè)連接返回;如果池中沒有空閑連接,則需要判斷當(dāng)前連接數(shù)是否達(dá)到最大連接數(shù),如果沒有達(dá)到就可以新建一個(gè)連接,如果達(dá)到了最大連接數(shù),就返回沒有連接的信息給用戶。 4.2.3、 close 方法的攔截 當(dāng)然程序還存在一個(gè)比較嚴(yán)重的問題,那就是資源釋放的方法,必須采用 free這個(gè)方法來把連接放回到鏈表中實(shí)現(xiàn)連接的復(fù)用。如果說別人應(yīng)用這個(gè) 連接池但卻采用的 close的方法釋放,那么這個(gè)連接就會(huì)被徹底關(guān)閉,連接池也就沒有達(dá)到預(yù)期的功能。為了不影響別人的習(xí)慣,讓這個(gè)數(shù)據(jù)庫的實(shí)現(xiàn)更加趨于完美,在這里就把 close方法給攔截下來,進(jìn)行修改,使其達(dá)到連接放回池中的目的。 圖 4-11是攔截 close方法的主要代碼。 天津科技大學(xué) 2014 屆 本科生 畢業(yè)論文 25 圖 4-11 攔截 close 代碼 創(chuàng)建一個(gè)新的類 ImplementConnetion實(shí)現(xiàn)了接口 Connetion,針對(duì)接口編程是面向?qū)ο蟮牡谝辉瓌t。 ImplementConnetion的實(shí)現(xiàn)需要真正的連接 Connetion和數(shù)據(jù)源 LinkedlistDataSource作為參數(shù)來把 Connetion和 LinkedlistDataSource傳入,最主要的是對(duì) close方法的修改,如果該連接當(dāng)前使用次數(shù) currentUseCount達(dá)到最大使用次數(shù) maxUseCount,就徹底關(guān)閉;如果沒有達(dá)到,就放回到鏈表中繼續(xù)使用。 同時(shí) LinkedlistDataSource 中的 createConnection方法也需要修改: private Connection createConnection() throws SQLException Connection Conn=DriverManager.getConnection(url, user, password); ImplementConnetion implementConnetion= new ImplementConnetion(Conn,this); return implementConnetion; 連 接 創(chuàng) 建 使 用 的 還 是 DriverManager 得到 Connection , 然 后 用ImplementConnetion構(gòu)造得到包裝后的連接,返回的連接是 ImplementConnetion,它可以應(yīng)用到所有 Connection可以使用的地方,當(dāng)使用 close關(guān)閉的時(shí)候還可以放回到連接池中。如下圖 4-12關(guān)閉連接時(shí)用的是 close方法,同時(shí)把最大連接數(shù)天津科技大學(xué) 2014 屆 本科生 畢業(yè)論文 26 maxCount設(shè)置為 、初始化連接數(shù) initCount設(shè)置為 以及最大使用次數(shù)maxUseCount設(shè)置為,這樣就可以簡(jiǎn)單地測(cè)試到最大使用次數(shù)的約束限制, 次連接就會(huì)出現(xiàn)前次跟后 次出現(xiàn)不同的連接,由于 ImplementConnetion的應(yīng)用,連接也會(huì)從原來的 Connetion變?yōu)?ImplementConnetion。 圖 4-12 close 攔截和最大使用次數(shù)測(cè)試 天津科技大學(xué) 2014 屆 本科生 畢業(yè)論文 27 結(jié)論 (1)本文先是研究了框架的整體概念,框架應(yīng)用于軟件開發(fā)的特點(diǎn)與重要意義。然后對(duì)主要的 Java框架進(jìn)行研究和簡(jiǎn)要介紹,主要包

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論