




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、畢業(yè)設(shè)計(jì)(計(jì)算機(jī)應(yīng)用工程系) 設(shè)計(jì)課題: Java數(shù)據(jù)庫連接池 專業(yè)班級(jí): 計(jì)算機(jī)應(yīng)用工程系0701 學(xué)生姓名: 孟德軍 學(xué)生學(xué)號(hào): 指導(dǎo)教師: * 第一章 目錄SJCP2第二章 課題背景31. 設(shè)計(jì)目的32. 連接池優(yōu)點(diǎn)33. 減少連接創(chuàng)建時(shí)間34. 簡化的編程模式35. 受控的資源使用46. 開源連接池46.1 C3P0 C3P046.2 Proxool46.3 Jakarta DBCP DBCP46.4 DDConnectionBroker DDConnectionBroker46.5 DBPool DBPool46.6 XAPool XAPoo46.7 Primrose Primros
2、e56.8 SmartPool SmartPool56.9 MiniConnectionPoolManager MiniConnectionPoolManager56.10 BoneCP BoneCP5第三章 數(shù)據(jù)庫61. 數(shù)據(jù)庫概述62. 數(shù)據(jù)庫連接池的基本原理63. 連接池的工作原理7第四章 連接池概念81. 連接池中的關(guān)鍵技術(shù)82. 連接池的分配與釋放83. 連接池的維護(hù)8第五章 系統(tǒng)總體設(shè)計(jì)思想及方案9設(shè)計(jì)理念91. 連接池中的管理機(jī)制92. 并發(fā)問題103. 連接池的分配與釋放104. 連接池的關(guān)閉10第六章 設(shè)計(jì)流程111. 連接池的管理172. 連接池的關(guān)閉173. 連接池的測(cè)試
3、184. 性能優(yōu)化23事務(wù)23連接管理23使用更新235. 連接池的泄露問題236. 產(chǎn)生現(xiàn)象247. 解決辦法24第七章 結(jié) 論26第八章 參考文獻(xiàn)27SJCP摘要 在基于JDBC的數(shù)據(jù)庫實(shí)際應(yīng)用開發(fā)中,對(duì)數(shù)據(jù)庫連接的管理是一個(gè)重點(diǎn)也是一個(gè)難點(diǎn),頻繁對(duì)數(shù)據(jù)庫的連接與關(guān)閉操作、多客戶對(duì)數(shù)據(jù)庫的并發(fā)訪問,一定程度上決定了WEB系統(tǒng)的響應(yīng)以及應(yīng)用性能。使用數(shù)據(jù)庫連接池方式能對(duì)數(shù)據(jù)庫的連接進(jìn)行管理和維護(hù),上層應(yīng)用程序通過數(shù)據(jù)庫連接池使用數(shù)據(jù)庫資源能提升系統(tǒng)性能,充分利用系統(tǒng)資源。文章通過介紹、分析數(shù)據(jù)庫連接池工作的基本原理,了解目前流行的WEB服務(wù)器在數(shù)據(jù)庫連接池方面的使用現(xiàn)狀后,總結(jié)一了些數(shù)據(jù)庫連
4、接池開發(fā)程序中容易忽略的問題。并在學(xué)習(xí)掌握了實(shí)現(xiàn)連接池的關(guān)鍵技術(shù)后給出了一個(gè)較為高效的連接池管理策略,在這種策略思想的指導(dǎo)下實(shí)際開發(fā)出一個(gè)數(shù)據(jù)庫連接池模塊,使得上層應(yīng)用通過本連接池訪問數(shù)據(jù)庫資源變得相對(duì)高效和容易,從實(shí)際上論證了這種設(shè)計(jì)方案的可行性。關(guān)鍵字 連接池;數(shù)據(jù)庫;JDBC;并發(fā)訪問第二章 課題背景1. 設(shè)計(jì)目的數(shù)據(jù)庫連接是一種關(guān)鍵的有限的昂貴的資源,這一點(diǎn)在多用戶的網(wǎng)頁應(yīng)用程序中體現(xiàn)得尤為突出。對(duì)數(shù)據(jù)庫連接的管理能顯著影響到整個(gè)應(yīng)用程序的伸縮性和健壯性,影響到程序的性能指標(biāo)。數(shù)據(jù)庫連接池正是針對(duì)這個(gè)問題提出來的。數(shù)據(jù)庫連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫連接,它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)
5、有的數(shù)據(jù)庫連接,而再不是重新建立一個(gè);釋放空閑時(shí)間超過最大空閑時(shí)間的數(shù)據(jù)庫連接來避免因?yàn)闆]有釋放數(shù)據(jù)庫連接而引起的數(shù)據(jù)庫連接遺漏。這項(xiàng)技術(shù)能明顯提高對(duì)數(shù)據(jù)庫操作的性能。2. 連接池優(yōu)點(diǎn)連接池是創(chuàng)建和管理一個(gè)連接的緩沖池的技術(shù),這些連接準(zhǔn)備好被任何需要它們的線程使用。這種把連接“匯集”起來的技術(shù)基于這樣的一個(gè)事實(shí):對(duì)于大多數(shù)應(yīng)用程序,當(dāng)它們正在處理通常需要數(shù)毫秒完成的事務(wù)時(shí),僅需要能夠訪問JDBC 連接的 1 個(gè)線程。當(dāng)不處理事務(wù)時(shí),這個(gè)連接就會(huì)閑置。相反,連接池允許閑置的連接被其它需要的線程使用。事實(shí)上,當(dāng)一個(gè)線程需要用 JDBC 對(duì)一個(gè) GBase 或其它數(shù)據(jù)庫操作時(shí),它從池中請(qǐng)求一個(gè)連接。
6、當(dāng)這個(gè)線程使用完了這個(gè)連接,將它返回到連接池中,這樣這就可以被其它想使用它的線程使用。當(dāng)連接從池中“借出”,它被請(qǐng)求它的線程專有地使用。從編程的角度來看,這和用戶的線程每當(dāng)需要一個(gè) JDBC 連接的時(shí)候調(diào)用DriverManager.getConnection() 是一樣的,采用連接池技術(shù),可通過使用新的或已有的連接結(jié)束線程。連接池可以極大的改善用戶的 Java 應(yīng)用程序的性能,同時(shí)減少全部資源的使用。連接池主要的優(yōu)點(diǎn)有:3. 減少連接創(chuàng)建時(shí)間 雖然與其它數(shù)據(jù)庫相比 GBase 提供了較為快速連接功能,但是創(chuàng)建新的 JDBC 連接仍會(huì)招致網(wǎng)絡(luò)和 JDBC 驅(qū)動(dòng)的開銷。如果這類連接是“循環(huán)”使用
7、的,使用該方式這些花銷就可避免。4. 簡化的編程模式 當(dāng)使用連接池時(shí),每一個(gè)單獨(dú)的線程能夠像創(chuàng)建了一個(gè)自己的 JDBC 連接一樣操作,允許用戶直接使用JDBC編程技術(shù)。5. 受控的資源使用 如果用戶不使用連接池,而是每當(dāng)線程需要時(shí)創(chuàng)建一個(gè)新的連接,那么用戶的應(yīng)用程序的資源使用會(huì)產(chǎn)生非常大的浪費(fèi)并由可能會(huì)導(dǎo)致高負(fù)載下的異常發(fā)生。注意,每個(gè)連到 GBase 的連接在客戶端和服務(wù)器端都有花銷(內(nèi)存,CPU,上下文切換等等)。每個(gè)連接均會(huì)對(duì)應(yīng)用程序和 GBase 服務(wù)器的可用資源帶來一定的限制。不管這些連接是否在做有用的工作,仍將使用這些資源中的相當(dāng)一部分。連接池能夠使性能最大化,同時(shí)還能將資源利用控
8、制在一定的水平之下,如果超過該水平,應(yīng)用程序?qū)⒈罎⒍粌H僅是變慢。6. 開源連接池6.1 C3P0 C3P0 C3P0 C3P0是一個(gè)開放源代碼的JDBC連接池,它在lib目錄中與Hibernate一起發(fā)布,包括了實(shí)現(xiàn)jdbc3和jdbc2擴(kuò)展規(guī)范說明的Connection 和Statement 池的DataSources 對(duì)象。 6.2 ProxoolProxool 這是一個(gè)Java SQL Driver驅(qū)動(dòng)程序,提供了對(duì)你選擇的其它類型的驅(qū)動(dòng)程序的連接池封裝??梢苑浅:唵蔚囊浦驳浆F(xiàn)存的代碼中。完全可配置??焖?,成熟,健壯??梢酝该鞯貫槟悻F(xiàn)存的JDBC驅(qū)動(dòng)程序增加連接池功能。6.3 Jaka
9、rta DBCP DBCPJakarta DBCP DBCP是一個(gè)依賴Jakarta commons-pool對(duì)象池機(jī)制的數(shù)據(jù)庫連接池.DBCP可以直接的在應(yīng)用程序用使用。6.4 DDConnectionBroker DDConnectionBrokerDDConnectionBroker DDConnectionBroker是一個(gè)簡單,輕量級(jí)的數(shù)據(jù)庫連接池。6.5 DBPool DBPoolDBPool DBPool是一個(gè)高效的易配置的數(shù)據(jù)庫連接池。它除了支持連接池應(yīng)有的功能之外,還包括了一個(gè)對(duì)象池使你能夠開發(fā)一個(gè)滿足自已需求的數(shù)據(jù)庫連接池。6.6 XAPool XAPooXAPool XA
10、Pool是一個(gè)XA數(shù)據(jù)庫連接池。它實(shí)現(xiàn)了javax.sql.XADataSource并提供了連接池工具。6.7 Primrose PrimrosePrimrose Primrose是一個(gè)Java開發(fā)的數(shù)據(jù)庫連接池。當(dāng)前支持的容器包括Tomcat4&5,Resin3與JBoss3.它同樣也有一個(gè)獨(dú)立的版本可以在應(yīng)用程序中使用而不必運(yùn)行在容器中。Primrose通過一個(gè)web接口來控制SQL處理的追蹤,配置,動(dòng)態(tài)池管理。在重負(fù)荷的情況下可進(jìn)行連接請(qǐng)求隊(duì)列處理。6.8 SmartPool SmartPoolSmartPool SmartPool是一個(gè)連接池組件,它模仿應(yīng)用服務(wù)器對(duì)象池的特性。
11、SmartPool能夠解決一些臨界問題如連接泄漏(connection leaks),連接阻塞,打開的JDBC對(duì)象如Statements,PreparedStatements等. SmartPool的特性包括支持多個(gè)pools,自動(dòng)關(guān)閉相關(guān)聯(lián)的JDBC對(duì)象, 在所設(shè)定time-outs之后察覺連接泄漏,追蹤連接使用情況, 強(qiáng)制啟用最近最少用到的連接,把SmartPool"包裝"成現(xiàn)存的一個(gè)pool等。6.9 MiniConnectionPoolManager MiniConnectionPoolManagerMiniConnectionPoolManager MiniCon
12、nectionPoolManager是一個(gè)輕量級(jí)JDBC數(shù)據(jù)庫連接池。它只需要Java1.5(或更高)并且沒有依賴第三方包。6.10 BoneCP BoneCPBoneCP BoneCP是一個(gè)快速,開源的數(shù)據(jù)庫連接池。幫你管理數(shù)據(jù)連接讓你的應(yīng)用程序能更快速地訪問數(shù)據(jù)庫。比C3P0/DBCP連接池快25倍。第三章 數(shù)據(jù)庫1. 數(shù)據(jù)庫概述數(shù)據(jù)庫(Database)是按照數(shù)據(jù)結(jié)構(gòu)來組織、存儲(chǔ)和管理數(shù)據(jù)的倉庫,它產(chǎn)生于距今五十年前,隨著信息技術(shù)和市場(chǎng)的發(fā)展,特別是二十世紀(jì)九十年代以后,數(shù)據(jù)管理不再僅僅是存儲(chǔ)和管理數(shù)據(jù),而轉(zhuǎn)變成用戶所需要的各種數(shù)據(jù)管理的方式。數(shù)據(jù)庫有很多種類型,從最簡單的存儲(chǔ)有各種數(shù)據(jù)
13、的表格到能夠進(jìn)行海量數(shù)據(jù)存儲(chǔ)的大型數(shù)據(jù)庫系統(tǒng)都在各個(gè)方面得到了廣泛的應(yīng)用。2. 數(shù)據(jù)庫連接池的基本原理 傳統(tǒng)的數(shù)據(jù)庫連接方式(指通過DriverManager和基本實(shí)現(xiàn)DataSource進(jìn)行連接)中,一個(gè)數(shù)據(jù)庫連接對(duì)象均對(duì)應(yīng)一個(gè)物理數(shù)據(jù)庫連接,數(shù)據(jù)庫連接的建立及關(guān)閉對(duì)系統(tǒng)而言是耗費(fèi)系統(tǒng)資源的操作,在多層結(jié)構(gòu)的應(yīng)用程式環(huán)境中這種耗費(fèi)資源的動(dòng)作對(duì)系統(tǒng)的性能影響尤為明顯。在多層結(jié)構(gòu)的應(yīng)用程式中通過連接池(connection pooling)技術(shù)能使系統(tǒng)的性能明顯得到提到,連接池意味著當(dāng)應(yīng)用程式需要調(diào)用一個(gè)數(shù)據(jù)庫連接的時(shí),數(shù)據(jù)庫相關(guān)的接口通過返回一個(gè)通過重用數(shù)據(jù)庫連接來代替重新創(chuàng)建一個(gè)數(shù)據(jù)庫連接。
14、通過這種方式,應(yīng)用程式能減少對(duì)數(shù)據(jù)庫連接操作,尤其在多層環(huán)境中多個(gè)客戶端能通過共享少量的物理數(shù)據(jù)庫連接來滿足系統(tǒng)需求。通過連接池技術(shù)Java應(yīng)用程式不僅能提高系統(tǒng)性能同時(shí)也為系統(tǒng)提高了可測(cè)量性。數(shù)據(jù)庫連接池是運(yùn)行在后臺(tái)的而且應(yīng)用程式的編碼沒有所有的影響。此中狀況存在的前提是應(yīng)用程式必須通過DataSource對(duì)象(一個(gè)實(shí)現(xiàn)javax.sql.DataSource接口的實(shí)例)的方式代替原有通過DriverManager類來獲得數(shù)據(jù)庫連接的方式。一個(gè)實(shí)現(xiàn)javax.sql.DataSource接口的類能支持也能不支持?jǐn)?shù)據(jù)庫連接池,不過兩者獲得數(shù)據(jù)庫連接的代碼基本是相同的。3. 連接池的工作原理在實(shí)
15、際應(yīng)用開發(fā)中,特別是在WEB應(yīng)用系統(tǒng)中,如果JSP、Servlet或EJB使用JDBC直接訪問數(shù)據(jù)庫中的數(shù)據(jù),每一次數(shù)據(jù)訪問請(qǐng)求都必須經(jīng)歷建立數(shù)據(jù)庫連接、打開數(shù)據(jù)庫、存取數(shù)據(jù)和關(guān)閉數(shù)據(jù)庫連接等步驟,而連接并打開數(shù)據(jù)庫是一件既消耗資源又費(fèi)時(shí)的工作,如果頻繁發(fā)生這種數(shù)據(jù)庫操作,系統(tǒng)的性能必然會(huì)急劇下降,甚至?xí)?dǎo)致系統(tǒng)崩潰。數(shù)據(jù)庫連接池技術(shù)是解決這個(gè)問題最常用的方法,在許多應(yīng)用程序服務(wù)器(例如:Weblogic,WebSphere,JBoss)中,基本都提供了這項(xiàng)技術(shù),無需自己編程,但是,深入了解這項(xiàng)技術(shù)是非常必要的。數(shù)據(jù)庫連接池技術(shù)的思想非常簡單,將數(shù)據(jù)庫連接作為對(duì)象存儲(chǔ)在一個(gè)Vector對(duì)象中,
16、一旦數(shù)據(jù)庫連接建立后,不同的數(shù)據(jù)庫訪問請(qǐng)求就可以共享這些連接,這樣,通過復(fù)用這些已經(jīng)建立的數(shù)據(jù)庫連接,可以克服上述缺點(diǎn),極大地節(jié)省系統(tǒng)資源和時(shí)間。數(shù)據(jù)庫連接池的主要操作如下:(1)建立數(shù)據(jù)庫連接池對(duì)象(服務(wù)器啟動(dòng))。(2)按照事先指定的參數(shù)創(chuàng)建初始數(shù)量的數(shù)據(jù)庫連接(即:空閑連接數(shù))。(3)對(duì)于一個(gè)數(shù)據(jù)庫訪問請(qǐng)求,直接從連接池中得到一個(gè)連接。如果數(shù)據(jù)庫連接池對(duì)象中沒有空閑的連接,且連接數(shù)沒有達(dá)到最大(即:最大活躍連接數(shù)),創(chuàng)建一個(gè)新的數(shù)據(jù)庫連接。(4)關(guān)閉數(shù)據(jù)庫,釋放所有數(shù)據(jù)庫連接(此時(shí)的關(guān)閉數(shù)據(jù)庫連接,并非真正關(guān)閉,而是將其放入空閑隊(duì)列中。如實(shí)際空閑連接數(shù)大于初始空閑連接數(shù)則釋放連接)。第四章
17、 連接池概念1. 連接池中的關(guān)鍵技術(shù) 連接復(fù)用,通過建立一個(gè)數(shù)據(jù)庫連接池以及一套連接使用、分配、管理策略,使得該連接池中的連接可以得到高效、安全的復(fù)用,避免了數(shù)據(jù)庫連接頻繁建立、關(guān)閉的開銷。2. 連接池的分配與釋放 3. 連接池的維護(hù) package org.whvcse.dbms;import java.io.Serializable;import java.sql.SQLException;import java.util.Vector;import org.whvcse.dbms.domain.ConnectionInfo;public interface IValidate exten
18、ds Serializablepublic Vector<ConnectionInfo> validate(Vector<ConnectionInfo> v)throws SQLException;第五章 系統(tǒng)總體設(shè)計(jì)思想及方案 設(shè)計(jì)理念1. 連接池中的管理機(jī)制 連接池管理策略是連接池機(jī)制的核心。當(dāng)連接池建立后,如何對(duì)連接池中的連接進(jìn)行管理,解決好連接池內(nèi)連接的分配和釋放,對(duì)系統(tǒng)的性能有很大的影響。連接的合理分配、釋放可提高連接的復(fù)用,降低了系統(tǒng)建立新連接的開銷,同時(shí)也加速了用戶的訪問速度。下面介紹連接池中連接的分配、釋放策略。連接池的分配、釋放策略對(duì)于有效復(fù)用連接非常
19、重要,我們采用的方法是一個(gè)很有名的設(shè)計(jì)模式:Reference Counting(引用記數(shù))。該模式在復(fù)用資源方面應(yīng)用的非常廣泛,把該方法運(yùn)用到對(duì)于連接的分配釋放上,為每一個(gè)數(shù)據(jù)庫連接,保留一個(gè)引用記數(shù),用來記錄該連接的使用者的個(gè)數(shù)。具體的實(shí)現(xiàn)方法是:當(dāng)客戶請(qǐng)求數(shù)據(jù)庫連接時(shí),首先查看連接池中是否有空閑連接(指當(dāng)前沒有分配出去的連接)。如果存在空閑連接,則把連接分配給客戶并作相應(yīng)處理(即標(biāo)記該連接為正在使用,引用計(jì)數(shù)加1)。如果沒有空閑連接,則查看當(dāng)前所開的連接數(shù)是不是已經(jīng)達(dá)到maxConn(最大連接數(shù)),如果沒達(dá)到就重新創(chuàng)建一個(gè)連接給請(qǐng)求的客戶;如果達(dá)到就按設(shè)定的maxWaitTime(最大等
20、待時(shí)間)進(jìn)行等待,如果等待maxWaitTime后仍沒有空閑連接,就拋出無空閑連接的異常給用戶。當(dāng)客戶釋放數(shù)據(jù)庫連接時(shí),先判斷該連接的引用次數(shù)是否超過了規(guī)定值,如果超過就刪除該連接,并判斷當(dāng)前連接池內(nèi)總的連接數(shù)是否小于minConn(最小連接數(shù)),若小于就將連接池充滿;如果沒超過就將該連接標(biāo)記為開放狀態(tài),可供再次復(fù)用??梢钥闯稣沁@套策略保證了數(shù)據(jù)庫連接的有效復(fù)用,避免頻繁地建立、釋放連接所帶來的系統(tǒng)資源開銷。2. 并發(fā)問題 為了使連接管理服務(wù)具有最大的通用性,必須考慮多線程環(huán)境,即并發(fā)問題。這個(gè)問題相對(duì)比較好解決,因?yàn)镴ava語言自身提供了對(duì)并發(fā)管理的支持,使用synchronized關(guān)鍵字
21、即可確保線程是同步的。使用方法為直接在類方法前面加上synchronized關(guān)鍵字,如:public synchronized Connection getConnection()3. 連接池的分配與釋放連接池的分配與釋放,對(duì)系統(tǒng)的性能有很大的影響。合理的分配與釋放,可以提高連接的復(fù)用度,從而降低建立新連接的開銷,同時(shí)還可以加快用戶的訪問速度。對(duì)于連接的管理可使用空閑池。即把已經(jīng)創(chuàng)建但尚未分配出去的連接按創(chuàng)建時(shí)間存放到一個(gè)空閑池中。每當(dāng)用戶請(qǐng)求一個(gè)連接時(shí),系統(tǒng)首先檢查空閑池內(nèi)有沒有空閑連接。如果有就把建立時(shí)間最長(通過容器的順序存放實(shí)現(xiàn))的那個(gè)連接分配給他(實(shí)際是先做連接是否有效的判斷,如果可
22、用就分配給用戶,如不可用就把這個(gè)連接從空閑池刪掉,重新檢測(cè)空閑池是否還有連接);如果沒有則檢查當(dāng)前所開連接池是否達(dá)到連接池所允許的最大連接數(shù)(maxConn),如果沒有達(dá)到,就新建一個(gè)連接,如果已經(jīng)達(dá)到,就等待一定的時(shí)間(timeout)。如果在等待的時(shí)間內(nèi)有連接被釋放出來就可以把這個(gè)連接分配給等待的用戶,如果等待時(shí)間超過預(yù)定時(shí)間timeout,則返回空值(null)。系統(tǒng)對(duì)已經(jīng)分配出去正在使用的連接只做計(jì)數(shù),當(dāng)使用完后再返還給空閑池。對(duì)于空閑連接的狀態(tài),可開辟專門的線程定時(shí)檢測(cè),這樣會(huì)花費(fèi)一定的系統(tǒng)開銷,但可以保證較快的響應(yīng)速度。也可采取不開辟專門線程,只是在分配前檢測(cè)的方法。4. 連接池的
23、關(guān)閉 public synchronized boolean destory() throws SQLException并發(fā)控制關(guān)閉連接池資源.public synchronized boolean destory() throws SQLException if (null = this.connectionPool)throw new SQLException("Connection UnInitializing");for (ConnectionInfo con : this.connectionPool) con.getConnection().close();co
24、n.setStartTime(0);if (null != this.validateLink)this.validateLink.clear();this.validateLink = null;this.connectionPool = null;return this.connectionPool = null && this.validateLink = null;第六章 設(shè)計(jì)流程流程和實(shí)現(xiàn) package org.whvcse.dbms.base;import java.io.Serializable;import java.sql.Connection;import
25、 java.sql.SQLException;import java.util.ArrayList;import java.util.List;import java.util.Vector;import org.whvcse.dbms.IConnectionLoader;import org.whvcse.dbms.IConnectionPoolLoader;import org.whvcse.dbms.ISQLBase;import org.whvcse.dbms.IValidate;import org.whvcse.dbms.domain.ConnectionInfo;import o
26、rg.whvcse.dbms.domain.Information;import org.whvcse.dbms.exception.LoadErrorException;import org.whvcse.dbms.loader.DefaultConnectionLoader;import org.whvcse.dbms.loader.PerpertiesLoader;/* * <span css='package_style'>連接池總控制器</span> * author 孟德軍 * */public class DriverManager imp
27、lements Serializableprivate static DriverManager manager = null;private Vector<ConnectionInfo> connectionPool = null;private ISQLBase dataSource = null;private List<IValidate> validateLink = null;private ConnectionInfo info=null;/private Transaction transaction=null;public DriverManager(
28、ISQLBase base) throws SQLExceptionthis.dataSource = base;/info.getConnection().this.connectionPool=this.InitFromDataSource();public DriverManager(IConnectionPoolLoader loader) throws SQLExceptionthis.connectionPool=this.InitFromConnectionPoolLoader(loader);public DriverManager(String path) throws SQ
29、LException, LoadErrorExceptionthis.connectionPool=this.InitFromProperties(path);/* * 添加驗(yàn)證聯(lián) * param v 驗(yàn)證程序 * return 驗(yàn)證后的集合 * throws NullPointerException */public synchronized int addValidate(IValidate v)throws NullPointerException if (null = this.validateLink)this.validateLink = new ArrayList<IVal
30、idate>();this.validateLink.add(v);return this.validateLink.size();private Vector<ConnectionInfo> InitFromDataSource() throws SQLExceptionVector<ConnectionInfo> tv = new Vector<ConnectionInfo>(this.dataSource.getMax();if (null = this.dataSource)throw new SQLException("DataSo
31、urce Initializing Failture");for (int i = 0; i < this.dataSource.getMin(); i+)tryConnection temp = this.dataSource.getConnection();if (null != temp && !temp.isClosed()ConnectionInfo info=new ConnectionInfo();info.setStartTime(System.currentTimeMillis();info.setConnection(temp);info.s
32、etId(tv.size()+1);tv.add(info); catch (SQLException e) e.printStackTrace();return tv;private Vector<ConnectionInfo> InitFromConnectionPoolLoader(IConnectionPoolLoader loader) throws SQLExceptionVector<ConnectionInfo> tv =loader.load();return tv;private Vector<ConnectionInfo> InitFr
33、omProperties(String path) throws SQLException, LoadErrorExceptionInformation ti=new PerpertiesLoader().Init(path);if (null = ti)throw new SQLException("PerpertiesLoader Initializing Failture");Vector<ConnectionInfo> tv = new Vector<ConnectionInfo>(ti.getMax();IConnectionLoader
34、tl=new DefaultConnectionLoader();for (int i = 0; i < ti.getMin(); i+)tryConnection temp =tl.loadConnection(ti);if (null != temp && !temp.isClosed()ConnectionInfo info=new ConnectionInfo();info.setStartTime(System.currentTimeMillis();info.setConnection(temp);info.setId(tv.size()+1);tv.add(
35、info); catch (SQLException e)e.printStackTrace();return tv;/* * 數(shù)據(jù)源連接池 * param base 標(biāo)準(zhǔn)數(shù)據(jù)源連接池 * return 連接池的單態(tài)實(shí)例 * throws SQLException */public synchronized static DriverManager getInstance(ISQLBase base)throws SQLExceptionif (null = manager)manager = new DriverManager(base);return manager;/* * 連接池加載器
36、連接池 * param loader 加載器 * return 連接池的單態(tài)實(shí)例 * throws SQLException */public synchronized static DriverManager getInstance(IConnectionPoolLoader loader)throws SQLExceptionif (null = manager)manager = new DriverManager(loader);return manager;/* * 配置文件加載器 * param path 配置文件的路徑 * return 連接池的單態(tài)實(shí)例 * throws SQL
37、Exception * throws LoadErrorException 讀取文件錯(cuò)誤 */public synchronized static DriverManager getInstance(String path)throws SQLException, LoadErrorException if (null = manager)manager = new DriverManager(path);return manager;/*3 * 獲取數(shù)據(jù)庫資源 * return 連接池管理的數(shù)據(jù)庫連接 * throws SQLException */public synchronized C
38、onnection getConnection() throws SQLExceptionif (null = this.connectionPool | this.connectionPool.size() = 0)throw new SQLException("Connection UnInitializing");=this.connectionPool.firstElement();Connection temp=info.getConnection();.setConnection(temp);this.connectionPo
39、ol.add();return temp;/* * 釋放數(shù)據(jù)庫連接資源 * param connection 使用完的數(shù)據(jù)庫連接,該連接不能為空或已關(guān)閉,否則會(huì)爆發(fā)SQLException異常. * return 釋放資源的狀態(tài). * throws SQLException */public synchronized boolean release(Connection connection)throws SQLExceptionthis.validate();if (null = connection | connection.isClosed()throw new SQL
40、Exception("Connection is Closed");elseConnectionInfo o=new ConnectionInfo();o.setId(this.connectionPool.size()+1);o.setEndTime(System.currentTimeMillis();o.setConnection(connection);this.connectionPool.add(o);return this.connectionPool = null;/* * 銷毀的連接池 * return 銷毀狀態(tài) * throws SQLException
41、 */public synchronized boolean destory() throws SQLException if (null = this.connectionPool)throw new SQLException("Connection UnInitializing");for (ConnectionInfo con : this.connectionPool) con.getConnection().close();con.setStartTime(0);if (null != this.validateLink)this.validateLink.cle
42、ar();this.validateLink = null;this.connectionPool = null;return this.connectionPool = null && this.validateLink = null;private synchronized boolean validate() throws SQLExceptionif (null != this.validateLink) for (IValidate ti : this.validateLink)Vector<ConnectionInfo> tv = ti.validate
43、(this.connectionPool);this.connectionPool = tv;return this.connectionPool = null;1. 連接池的管理 SJCP采用單例模式與工廠模式,連接池管理器統(tǒng)一管理數(shù)據(jù)庫的鏈接,并基于面向接口編程,將優(yōu)化程序交給用戶,但提供的默認(rèn)的接口實(shí)現(xiàn),從而提高管理的效率.2. 連接池的關(guān)閉 public synchronized boolean destory() throws SQLException if (null = this.connectionPool)throw new SQLException("Connec
44、tion UnInitializing");for (ConnectionInfo con : this.connectionPool) con.getConnection().close();con.setStartTime(0);if (null != this.validateLink)this.validateLink.clear();this.validateLink = null;this.connectionPool = null;return this.connectionPool = null && this.validateLink = null;
45、3. 連接池的測(cè)試 package main;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.util.Vector;import org.whvcse.dbms.base.SQLBaseAdapter;import org.whvcse.dbms.domain.ConnectionInfo;public class SqlDataSource extends SQLBaseAdapter/* * */private static final lo
46、ng serialVersionUID = 1L;private Connection connection=null;private final String USERNAME="root"private final String PASSWORD="admin"private final String URL="jdbc:mysql:/localhost:3306/mysql"private final String DRIVERCLASS="com.mysql.jdbc.Driver"Overridepubl
47、ic Connection getConnection() throws SQLExceptionif(null=this.connection)tryClass.forName(DRIVERCLASS); catch (ClassNotFoundException e)e.printStackTrace();this.connection=DriverManager.getConnection(URL,USERNAME,PASSWORD);return this.connection;Overridepublic Vector<ConnectionInfo> validate(V
48、ector<ConnectionInfo> v)throws SQLException return v;Overridepublic int getMax() / TODO Auto-generated method stubreturn 10;Overridepublic int getMin() / TODO Auto-generated method stubreturn 5;package main;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;impor
49、t java.sql.Statement;import org.whvcse.dbms.ISQLBase;import org.whvcse.dbms.base.DriverManager;public class TestDriverManager public TestDriverManager() throws SQLExceptionthis.Init();private void Init() throws SQLExceptionISQLBase o=new SqlDataSource();DriverManager manager=null;manager=DriverManager.getInstance(o);manager.addValidate(o);for(int i=0;i<80000;i+)Connection con=manager.getConnection();Statement statement=con.createStatement();ResultSet set=statement.executeQuery("select * from user");while(set.next
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 眾籌股東合同范例6
- 南匯食品運(yùn)輸合同范例
- 三年級(jí)數(shù)數(shù)學(xué)解決問題教案
- 叉車裝卸合同范本
- 加工木門合同范本
- 單位用品批發(fā)合同范本
- 付款分期合同范本
- 制造師證書掛靠合同范本
- 《童年的秘密》讀書心得體會(huì)
- 司機(jī) 勞動(dòng)合同范本
- 2025年舞蹈培訓(xùn)機(jī)構(gòu)學(xué)員培訓(xùn)合同范本
- 2025年保險(xiǎn)銷售業(yè)務(wù)人員崗位職業(yè)技能資格知識(shí)考試題(附答案)
- 兒科護(hù)理模擬考試題與參考答案
- 注意缺陷與多動(dòng)障礙疾病科普幼兒心理健康教育課件
- 水利行業(yè)知識(shí)培訓(xùn)課件
- 區(qū)域臨床檢驗(yàn)中心
- 2025-2030年中國人力資源服務(wù)行業(yè)全國市場(chǎng)開拓戰(zhàn)略制定與實(shí)施研究報(bào)告
- 2024年07月長沙農(nóng)村商業(yè)銀行股份有限公司2024年招考3名信息科技專業(yè)人才筆試歷年參考題庫附帶答案詳解
- 中醫(yī)預(yù)防流感知識(shí)講座
- 事故隱患內(nèi)部報(bào)告獎(jiǎng)勵(lì)機(jī)制實(shí)施細(xì)則
- 《CT、MR的臨床應(yīng)用》課件
評(píng)論
0/150
提交評(píng)論