




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、一、連接池的基本工作原理1、基本概念及原理數(shù)據(jù)庫連接池的基本思想就是為數(shù)據(jù)庫連接建立一個“緩沖池”。預(yù)先在緩沖池中放入一定數(shù)量的連接,當(dāng)需要建立數(shù)據(jù)庫連接時,只需從“緩沖池”中取出一個,使用完畢之后再放回去。我們可以通過設(shè)定連接池最大連接數(shù)來防止系統(tǒng)無盡的與數(shù)據(jù)庫連接。更為重要的是我們可以通過連接池的管理機制監(jiān)視數(shù)據(jù)庫的連接的數(shù)量和使用情況,為系統(tǒng)開發(fā)、測試及性能調(diào)整提供依據(jù)。2、服務(wù)器自帶的連接池JDBC的API中沒有提供連接池的方法。一些大型的WEB應(yīng)用服務(wù)器如BEA的WebLogic和IBM的WebSphere等提供了連接池的機制,但是必須有其第三方的專用類方法支持連接池的用法。二、連接
2、池關(guān)鍵問題分析1、并發(fā)問題為了使連接管理服務(wù)具有最大的通用性,必須考慮多線程環(huán)境,即并發(fā)問題。這個問題相對比較好解決,因為Java語言自身提供了對并發(fā)管理的支持,使用synchronized關(guān)鍵字即可確保線程是同步的。使用方法為直接在類方法前面加上synchronized關(guān)鍵字,如:publicsynchronizedConnectiongetConnection()2、多數(shù)據(jù)庫服務(wù)器和多用戶對于大型的企業(yè)級應(yīng)用,常常需要同時連接不同的數(shù)據(jù)庫(如連接Oracle和Sybase)。如何連接不同的數(shù)據(jù)庫呢?我們采用的策略是:設(shè)計一個符合單例模式的連接池管理類,在連接池管理類的唯一實例被創(chuàng)建時讀取一
3、個資源文件,其中資源文件中存放著多個數(shù)據(jù)庫的地址、用戶名、密碼等信息。根據(jù)資源文件提供的信息,創(chuàng)建多個連接池類的實例,每一個實例都是一個特定數(shù)據(jù)庫的連接池。連接池管理類實例為每個連接池實例取一個名字,通過不同的名字來管理不同的連接池。對于同一個數(shù)據(jù)庫有多個用戶使用不同的名稱和密碼訪問的情況,也可以通過資源文件處理,即在資源文件中設(shè)置多個具有相同url地址,但具有不同用戶名和密碼的數(shù)據(jù)庫連接信息。3、事務(wù)處理我們知道,事務(wù)具有原子性,此時要求對數(shù)據(jù)庫的操作符合“ALL-ALL-NOTHING”原則,即對于一組SQL語句要么全做,要么全不做。在Java語言中,Connection類本身提供了對事務(wù)
4、的支持,可以通過設(shè)置Connection的AutoCommit屬性為false,然后顯式的調(diào)用commit或rollback方法來實現(xiàn)。但要高效的進行Connection復(fù)用,就必須提供相應(yīng)的事務(wù)支持機制??刹捎妹恳粋€事務(wù)獨占一個連接來實現(xiàn),這種方法可以大大降低事務(wù)管理的復(fù)雜性。4、連接池的分配與釋放連接池的分配與釋放,對系統(tǒng)的性能有很大的影響。合理的分配與釋放,可以提高連接的復(fù)用度,從而降低建立新連接的開銷,同時還可以加快用戶的訪問速度。對于連接的管理可使用空閑池。即把已經(jīng)創(chuàng)建但尚未分配出去的連接按創(chuàng)建時間存放到一個空閑池中。每當(dāng)用戶請求一個連接時,系統(tǒng)首先檢查空閑池內(nèi)有沒有空閑連接。如果有
5、就把建立時間最長(通過容器的順序存放實現(xiàn))的那個連接分配給它(實際是先做連接是否有效的判斷,如果可用就分配給用戶,如果不可用就把這個連接從空閑池刪掉,重新檢測空閑池是否還有連接),如果沒有則檢查當(dāng)前所開連接池是否達(dá)到連接池所允許的最大連接數(shù)(maxConn),如果沒有達(dá)到,就新建一個連接,如果已經(jīng)達(dá)到,就等待一定的時間(timeout)。如果在等待的時間內(nèi)有連接被釋放出來就可以把這個連接分配給等待的用戶,如果等待時間超過預(yù)定時間timeout,則返回空值(null)。系統(tǒng)對已經(jīng)分配出去正在使用的連接只做計數(shù),當(dāng)使用完后再返還給空閑池。對于空閑連接的狀態(tài),可開辟專門的線程定時檢測,這樣會花費一定
6、的系統(tǒng)開銷,但可以保證較快的響應(yīng)速度。也可采取不開辟專門線程,只是在分配前檢測的方法。5、連接池的配置與維護連接池中到底應(yīng)該放置多少連接,才能使系統(tǒng)的性能最佳?系統(tǒng)可采取設(shè)置最小連接數(shù)(minConn)和最大連接數(shù)(maxConn)來控制連接池中的連接。最小連接數(shù)是系統(tǒng)啟動時連接池所創(chuàng)建的連接數(shù)。如果創(chuàng)建過多,則系統(tǒng)啟動就慢,但創(chuàng)建后系統(tǒng)的響應(yīng)速度會很快;如果創(chuàng)建過少,則系統(tǒng)啟動的很快,響應(yīng)起來卻慢。這樣,可以在開發(fā)時,設(shè)置較小的最小連接數(shù),開發(fā)起來會快,而在系統(tǒng)實際使用時設(shè)置較大的,因為這樣對訪問客戶來說速度會快些。最大連接數(shù)是連接池中允許連接的最大數(shù)目,具體設(shè)置多少,要看系統(tǒng)的訪問量,可通
7、過反復(fù)測試,找到最佳點。如何確保連接池中的最小連接數(shù)呢?有動態(tài)和靜態(tài)兩種策略。動態(tài)即每隔一定時間就對連接池進行檢測,如果發(fā)現(xiàn)連接數(shù)量小于最小連接數(shù),則補充相應(yīng)數(shù)量的新連接,以保證連接池的正常運轉(zhuǎn)。靜態(tài)是發(fā)現(xiàn)空閑連接不夠時再去檢查。三、連接池的實現(xiàn)1、連接池模型本文討論的連接池包括一個連接池類(DBConnectionPool)和一個連接池管理類(DBConnetionPoolManager)。連接池類是對某一數(shù)據(jù)庫所有連接的“緩沖池”主要實現(xiàn)以下功能:從連接池獲取或創(chuàng)建可用連接;使用完畢之后,把連接返還給連接池;在系統(tǒng)關(guān)閉前,斷開所有連接并釋放連接占用的系統(tǒng)資源;還能夠處理無效連接(原來登記為
8、可用的連接,由于某種原因不再可用,如超時,通訊問題),并能夠限制連接池中的連接總數(shù)不低于某個預(yù)定值和不超過某個預(yù)定值。連接池管理類是連接池類的外覆類(wrapper),符合單例模式,即系統(tǒng)中只能有一個連接池管理類的實例。其主要用于對多個連接池對象的管理,具有以下功能:裝載并注冊特定數(shù)據(jù)庫的JDBC驅(qū)動程序;根據(jù)屬性文件給定的信息,創(chuàng)建連接池對象;為方便管理多個連接池對象,為每一個連接池對象取一個名字,實現(xiàn)連接池名字與其實例之間的映射;跟蹤客戶使用連接情況,以便需要是關(guān)閉連接釋放資源。連接池管理類的引入主要是為了方便對多個連接池的使用和管理,如系統(tǒng)需要連接不同的數(shù)據(jù)庫,或連接相同的數(shù)據(jù)庫但由于安
9、全性問題,需要不同的用戶使用不同的名稱和密碼。2、連接池實現(xiàn)DBConnectionPool:連接池類。,packagecom.svse.pool;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;importjava.util.ArrayList;importjava.util.Iterator;importjava.util.List;/*此內(nèi)部類定義了一個連接池.它能夠根據(jù)要求創(chuàng)建新連接,直到預(yù)定的最大連接數(shù)為止在返回連接給客戶程序之前,它能夠驗證連接的有效性.author
10、svse*/publicclassDBConnectionPool/*傳說中的連接池*/privateListfreeConnections=newArrayList();privateConnectioncon=null;privateintconnect=0;/使用的連接數(shù)privateintmaxConn;/最大連接SuppressWarnings(unused)privateStringname;/連接池名字privateStringdriver;/驅(qū)動privateStringurl;/數(shù)據(jù)庫連接地址privateString;privateStringpassword;/密碼/*有
11、參構(gòu)造創(chuàng)建連接池*paramdriverparamnameparamURLparamuserparampasswordparammaxConn*/publicDBConnectionPool(Stringname,Stringdriver,StringURL,Stringuser,Stringpassword,intmaxConn)=name;this.driver=driver;this.url=URL;this.user=user;this.password=password;this.maxConn=maxConn;poolInfo();/*顯示準(zhǔn)備創(chuàng)建連接池的信息*/privatevo
12、idpoolInfo()Connectionconn=this.newConnection();freeConnections.add(conn);for(inti=0;i0)con=this.freeConnections.get(0);/*當(dāng)在池中取出一個連接后,刪除此連接*/this.freeConnections.remove(O);/*當(dāng)取出的連接為null時,遞歸調(diào)用自己,直到獲得一個可用連接為止*/if(con=null)con=getConnection();elsecon=newConnection();if(this.maxConn=0|this.maxConnthis.c
13、onnect)/*等待超過最大連接時*/con=;if(!=)this.connect+;returncon;/*釋放全部連接*/publicsynchronizedvoidrelease()IteratorallConns=this.freeConnections.iterator();while(allConns.hasNext()Connectionconn=(Connection)allConns.next();tryif(null!=conn)conn.close();conn=;catch(SQLExceptione)e.printStackTrace();this.freeCon
14、nections.clear();/*創(chuàng)建一個數(shù)據(jù)庫連接對象*return返回數(shù)據(jù)庫連接*/privateConnectionnewConnection()tryClass.forName(driver);catch(ClassNotFoundExceptione2)e2.printStackTrace();trycon=DriverManager.getConnection(url,user,password);catch(SQLExceptione1)e1.printStackTrace();System.exit(0);returncon;DBConnectionManager:連接池管
15、理類。packagecom.svse.pool;importjava.sql.Connection;importjava.util.Enumeration;importjava.util.Hashtable;/*連接池的管理類,負(fù)責(zé)讀取配置連接池的文件,并創(chuàng)建連接池*從池中獲取,釋放連接*authorsvse*/publicclassDBConnectionManager/*唯一數(shù)據(jù)庫連接池管理實例類*使用單例模式創(chuàng)建*/privatestaticDBConnectionManagerinstance;/*連接池的集合,*/privateHashtablepools=newHashtable(
16、);/*得到唯一實例管理類*return一個連接池的管理類*/publicstaticsynchronizedDBConnectionManagergetInstance(Stringname)if(instance=null)instance=newDBConnectionManager(name);returninstance;/*只允許內(nèi)部實例化管理類*/privateDBConnectionManager(Stringname)this.init(name);/*加載驅(qū)動程序*/privatevoidinit(Stringname)PoolParsepoolParse=newPoolP
17、arse(name);DBConnectionPoolpool=newDBConnectionPool(poolParse.getName(),poolParse.getDriver(),poolParse.getUrl(),poolParse.getUser(),poolParse.getPassword(),poolParse.getMaxconn();pools.put(poolParse.getName(),pool);/*根據(jù)連接池的名字得到一個連接*paramname連接池的名稱return池中的一個可用連接*/publicConnectiongetConnection(Strin
18、gname)DBConnectionPoolpool=null;Connectioncon=null;pool=pools.get(name);trycon=pool.getConnection();catch(Exceptione)e.printStackTrace();returncon;/*釋放一個連接*paramname連接池的名稱paramcon將要是釋放的連接對象*/publicsynchronizedvoidfreeConnection(Stringname,Connectioncon)DBConnectionPoolpool=pools.get(name);/根據(jù)連接池名稱得至
19、U連接池if(pool!=null)pool.freeConnection(con);/釋放連接/*釋放所有連接*/publicsynchronizedvoidrelease()Enumerationallpools=pools.elements();while(allpools.hasMoreElements()DBConnectionPoolpool=allpools.nextElement();if(pool!=null)pool.release();pools.clear();PoolParse:讀取數(shù)據(jù)庫連接。packagecom.svse.pool;importjava.io.Un
20、supportedEncodingException;.URLDecoder;importjavax.xml.parsers.DocumentBuilder;importjavax.xml.parsers.DocumentBuilderFactory;importorg.w3c.dom.Document;importorg.w3c.dom.Element;importorg.w3c.dom.NodeList;publicclassPoolParseprivatestaticStringpath;statictrypath=URLDecoder.decode(PoolParse.class.ge
21、tResource(/com/svse/pool/pool.xml).getPath(),UTF-8);catch(UnsupportedEncodingExceptione)/TODOAuto-generatedcatchblockthrownewRuntimeException(e);publicPoolParse(Stringname)DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();Documentdoc=null;tryDocumentBuilderdb=dbf.newDocumentBuilder();do
22、c=db.parse(path);catch(Exceptione)/TODOAuto-generatedcatchblockthrownewRuntimeException(e);NodeListnodeList=doc.getElementsByTagName(config);for(inti=0;inodeList.getLength();i+)Elemente=(Element)nodeList.item(i);if(e.getElementsByTagName(name).item(0).getTextContent().equals(name)this.setName(e.getE
23、lementsByTagName(name).item(0).getTextContent();this.setDriver(e.getElementsByTagName(driver).item(0).getTextContent();this.setUrl(e.getElementsByTagName(url).item(0).getTextContent(this.setUser(e.getElementsByTagName(user).item(0).getTextContent();this.setPassword(e.getElementsByTagName(password).i
24、tem(0).getTextContent();this.setMaxconn(Integer.parseint(e.getElementsByTagName(maxconn).item(0).getTextContent();break;privateprivateprivateprivateprivateprivateStringStringStringStringStringname;driver;url;user;password;Integermaxconn;publicStringgetName()returnname;publicvoidsetName(Stringname)=n
25、ame;publicStringgetDriver()returndriver;publicvoidsetDriver(Stringdriver)this.driver=driver;publicStringgetUrl()returnurl;publicvoidsetUrl(Stringurl)this.url=url;publicStringgetUser()returnuser;publicvoidsetUser(Stringuser)this.user=user;publicStringgetPassword。returnpassword;publicvoidsetPassword(S
26、tringpassword)this.password=password;publicIntegergetMaxconn()returnmaxconn;publicvoidsetMaxconn(Integermaxconn)this.maxconn=maxconn;pool.xml:記錄數(shù)據(jù)庫連接信息。oracleoracle.jdbc.driver.OracleDriverjdbc:oracle:thin:PC-200911080919:1521:orclscottpasswordtiger4sqlxxxxxxsa1234564mysqlxxxxxxroot1234564Test:用于測試。packagecom.svse.pool;importjava.sql.Connection;publicclassTestpublicstaticvoidmain(Stringargs)/獲取一個實例DBConnectionManagermanager=DBConnectionManager.getInstance(oracle);/獲取一個連接Connectionco
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工廠環(huán)境保護手冊
- 2025年水資源利用:實驗室用水課件探討
- 2025年市場營銷學(xué)課件概覽
- 2024年同學(xué)會講話稿范文(19篇)
- 高中軍訓(xùn)總結(jié)600字(31篇)
- DB31∕T 243-2011 種豬場驗收標(biāo)準(zhǔn)
- 安全生產(chǎn)法規(guī)知識
- 汽車使用性能與檢測技術(shù)
- 柳宗元散文的藝術(shù)特點賞析教學(xué)教案
- 房地產(chǎn)合伙協(xié)議書
- 沖壓廢料自動輸送裝置設(shè)計
- 公園棧道棧橋施工方案
- 不規(guī)則抗體篩查與鑒定
- 中國銀行海爾多聯(lián)機方案書
- 涂布機初級操作技術(shù)與維修培訓(xùn)課件
- GB/T 8417-2003燈光信號顏色
- GB/T 7984-2001輸送帶具有橡膠或塑料覆蓋層的普通用途織物芯輸送帶
- GB/T 7631.10-2013潤滑劑、工業(yè)用油和有關(guān)產(chǎn)品(L類)的分類第10部分:T組(渦輪機)
- GB/T 7324-2010通用鋰基潤滑脂
- GB/T 28114-2011鎂質(zhì)強化瓷器
- GB/T 15566.1-2020公共信息導(dǎo)向系統(tǒng)設(shè)置原則與要求第1部分:總則
評論
0/150
提交評論