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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

溫馨提示

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

評論

0/150

提交評論