對(duì)象池技術(shù)概述_第1頁(yè)
對(duì)象池技術(shù)概述_第2頁(yè)
對(duì)象池技術(shù)概述_第3頁(yè)
對(duì)象池技術(shù)概述_第4頁(yè)
對(duì)象池技術(shù)概述_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余10頁(yè)可下載查看

下載本文檔

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

文檔簡(jiǎn)介

commons-poolAPI,將用完的對(duì)象返回對(duì)象池中說(shuō),能夠提高應(yīng)用的性能。commons-dbcpcommons-poolcommons-dbcpcommons-pooltomcatJNDIjavax.sql.DataSource使用dbcporg.apachemons.dbcp.BasicDataSource。我們可以從這個(gè)稱為“數(shù)據(jù)源”的類中調(diào)用getConnection方法來(lái)獲得與數(shù)據(jù)外部使用者來(lái)說(shuō)是透亮的。BasicDataSourcegetConnectionPoolingDataSourcegetConnectionPoolingDataSourceObjectPool,在getConnectionObjectPoolObjectPool.borrowObjectcommons-poolObjectPoolFactorydbcporg.apachemons.pool.PoolableObjectFactoryorg.apachemons.dbcp.PoolableConnectionFactorymakeObjectConnectionPoolableConnectionFactoryConnectionFactory,ConnectionFactory3ConnectionDriverConnectionFactoryDriverConnection。最近在做一個(gè)內(nèi)部測(cè)試工具類的優(yōu)化工作中接觸到了連接池,對(duì)象池技術(shù),將原事實(shí)證明,經(jīng)過(guò)兩次改造,原來(lái)一個(gè)比較大的測(cè)試類需要500多秒,第一次優(yōu)化后只需要30080改造過(guò)程中的一些總結(jié).么請(qǐng)使用對(duì)象池.內(nèi)部原理簡(jiǎn)潔的說(shuō),就是將創(chuàng)立的對(duì)象放到一個(gè)容器中,用完之后不是銷毀而是再放回該容器,讓其他的對(duì)象調(diào)用,對(duì)象池中還涉及到一池中沒有可用空閑對(duì)象時(shí)等待等等.之前,這里先理解幾個(gè)概念:并且包含了用來(lái)創(chuàng)立池對(duì)象的工廠對(duì)象池對(duì)象:就是要放到池容器中的對(duì)象,理論上可以是任何對(duì)象.說(shuō)的.池對(duì)象工廠(PoolableObjectFactory接口):用來(lái)創(chuàng)立池對(duì)象,將不用的池對(duì)象進(jìn)展鈍化(passivateObject),(activeObject),池對(duì)象進(jìn)展驗(yàn)證(validateObject),對(duì)有問題的池對(duì)象進(jìn)展銷毀(destroyObject)等工作對(duì)象池中封裝了創(chuàng)立,獵取,歸還,銷毀池對(duì)象的職責(zé),固然這些工作都是通會(huì)對(duì)容器大小,存放時(shí)間,訪問等待時(shí)間,空閑時(shí)間等等進(jìn)展一些掌握,由于可以依據(jù)需要來(lái)調(diào)整這些設(shè)置.到達(dá)池容器的最大值,而對(duì)象池中又經(jīng)沒有空閑的對(duì)象,那么將會(huì)連續(xù)等待,個(gè)限度,對(duì)象池就會(huì)拋出特別.BasePoolableObjectFactory.addObject以備后用.為了確保對(duì)對(duì)象池的訪問都是線程安全的,全部對(duì)容器的操作都必需放在synchronizedapachecommon-pool5:GenericObjectPoolGenericKeyedObjectPool,SoftReferenceObjectPool,StackObjectPool,StackKeyedObjectPool.五種對(duì)象池可分為兩類,一類是無(wú)keykeyCursorableLinkedList來(lái)做容器,SoftReferenceObjectPoolArrayList用(SoftReferencejvm圾回收,從而具有很強(qiáng)的緩存力量.最終兩種用Stackkey池是對(duì)前面池技術(shù)原理的一種簡(jiǎn)潔實(shí)現(xiàn),帶key的相對(duì)簡(jiǎn)單一些,它會(huì)將池對(duì)keykeykey,keymakeObject方法創(chuàng)立的對(duì)象根本上都是一模一樣的,由于沒法傳遞參數(shù)來(lái)對(duì)池對(duì)象進(jìn)展定制.因此四種池對(duì)象的區(qū)分主要表達(dá)在內(nèi)部的容器的區(qū)分,CursorableLinkedList內(nèi)部用游標(biāo)(cursor)來(lái)定位當(dāng)前元素的雙向鏈表,是非線程安全的,但是能滿足對(duì)容器的并發(fā)修改.ArrayListreturnObject,銷毀clear,close.下面是一些時(shí)序圖:borrowObject:returnObject:invalidateObject:apachecommon-dbcpcommon-poolcommon-dbcpConnection,StatmentPoolableConnection,PoolablePreparedStatement.JavaJavaJavaJava_pool.returnObject(_key,this);這樣一句,將連接對(duì)象放回連接池中.ObjectPool,KeyedObjectPool,由于一個(gè)數(shù)據(jù)庫(kù)只對(duì)應(yīng)一個(gè)連接,而執(zhí)行操作的StatementSqlsql在對(duì)連接池的治理上,common-dbcp主要承受兩種對(duì)象:PoolingDriver,另一個(gè)是PoolingDataSource,二者的區(qū)分是PoolingDriver連接池,即一個(gè)數(shù)據(jù)源對(duì)應(yīng)一個(gè)連接池.下面是common-dbcp的構(gòu)造關(guān)系:Java下面是參考了common-dbcpJava1./***創(chuàng)立連接3. *4. *@since2023-1-2202:58:355. */publicclassConnectionUtils{//common-dbcpprotocol privatestaticfinalStringPOOL_DRIVER_KEY=“jdbc:apache:commons:dbcp:“; privatestaticfinalStringPOLLING_DRIVER=“mons.dbcp.PoolingDriver“;10.11. /**12. *取得池化驅(qū)動(dòng)器13. **@return*@throwsClassNotFoundException*@throwsSQLException17. */privatestaticPoolingDrivergetPoolDriverthrowsClassNotFoundException,SQLException{Class.forName(POLLING_DRIVER);return(PoolingDriver)DriverManager.getDriver(POOL_DRIVER_KEY);22. }23.24. /**25. *銷毀全部連接26. *27. *@throwsException28. */publicstaticvoiddestorythrowsException{PoolingDriverdriver=getPoolDriver;String[]names=driver.getPoolNames;for(Stringname:names){driver.getConnectionPool(name).close;34. }35. }36.37. /**38. *從連接池中獵取數(shù)據(jù)庫(kù)連接39. */publicstaticConnectiongetConnection(TableMetaDatatable)throwsException{Stringkey=table.getConnectionKey;43.44. PoolingDriverdriver=getPoolDriver;45.ObjectPoolpool=null;//catchtry{pool=driver.getConnectionPool(key);}catch(Exceptione){51. }52.if(pool==null){//依據(jù)數(shù)據(jù)庫(kù)類型構(gòu)建連接工廠ConnectionFactoryconnectionFactory=null;if(table.getDbAddr!=null&&TableMetaData.DB_TYPE_MYSQL==table.getDbType){Class.forName(TableMetaData.MYSQL_DRIVER);connectionFactory=newDriverManagerConnectionFactory(table.getDBUrl,null);}else{Class.forName(TableMetaData.ORACLE_DRIVER);connectionFactory=newDriverManagerConnectionFactory(table.getDBUrl,table.getDbuser,table.getDbpass);65. }66.//構(gòu)造連接池ObjectPoolconnectionPool=newGenericObjectPool(null);newPoolableConnectionFactory(connectionFactory,connectionPool,70.null,null,false,true);71.72.//driver73.driver.registerPool(key,connectionPool);74.}75.//從連接池中拿一個(gè)連接returnDriverManager.getConnection(POOL_DRIVER_KEY+key);78. }79.80.}Java對(duì)象的生命周期大致包括三個(gè)階段:對(duì)象的創(chuàng)立,對(duì)象的使用,對(duì)象的去除。因此,對(duì)象的生命周期長(zhǎng)度可Java對(duì)象的生命周期大致包括三個(gè)階段:對(duì)象的創(chuàng)立,對(duì)象的使用,對(duì)象的去除。因此,對(duì)象的生命周期長(zhǎng)度可用如下的表達(dá)式表示:T=T1+T2+T3。其中T1T2T3其去除時(shí)間。由此,我們可以看出,只有T2是真正有效的時(shí)間,而T1、T3則是對(duì)象本身的開銷。下面再看看T1、T3我們知道,Java對(duì)象是通過(guò)構(gòu)造函數(shù)來(lái)創(chuàng)立的,在這一過(guò)程中,該構(gòu)造函數(shù)鏈中的全部構(gòu)造函數(shù)也都會(huì)被自Javal整數(shù)變量(byte、short、int、long0,float和double0.0,規(guī)律值設(shè)置成false。所以用new11一些操作所消耗時(shí)間的比照表運(yùn)算操作例如標(biāo)準(zhǔn)化時(shí)間本地賦值i=n1.0實(shí)例賦值this.i=n1.2方法調(diào)用Funct5.9建對(duì)象NewObject980建數(shù)組Newint[10]31001980980166倍,而假設(shè)建一個(gè)數(shù)組所花費(fèi)的時(shí)間就更多了。再看去除對(duì)象的過(guò)程。我們知道,Java語(yǔ)言的一個(gè)優(yōu)勢(shì),就是Java程序員勿需再像C/C++程序員那樣,顯式地釋放對(duì)象,而由稱為垃圾收集器(GarbageCollector)的自動(dòng)內(nèi)存治理系統(tǒng),定時(shí)或在內(nèi)存凸現(xiàn)出缺乏時(shí),自動(dòng)回收垃圾對(duì)象所占的內(nèi)存。凡事有利總也有弊,這雖然為Java程序設(shè)計(jì)者供給了極大的便利,但同時(shí)它也帶來(lái)了較大的性能開銷。這種開銷包括兩方面,首先是對(duì)象治理開銷,GC為了能夠正確釋放對(duì)象,它必需監(jiān)控每一個(gè)對(duì)象的運(yùn)行狀態(tài),包括對(duì)象的申請(qǐng)、引用、被引用、賦值等。其次,在GC開頭回收“垃圾”對(duì)象時(shí),系統(tǒng)會(huì)暫停應(yīng)用程序的執(zhí)行,而單獨(dú)占用CPU。T1、T3的時(shí)間,而這些均可以通過(guò)對(duì)象池技術(shù)來(lái)實(shí)現(xiàn)。對(duì)象池技術(shù)的根本原理對(duì)象池技術(shù)根本原理的核心有兩點(diǎn):緩存和共享,即對(duì)于那些被頻繁使用的對(duì)象,在使用完后,不馬上將它們釋放,而是將它們緩存起來(lái),以供后續(xù)的應(yīng)用程序重復(fù)使用,從而削減創(chuàng)立對(duì)象和釋放對(duì)象的次數(shù),進(jìn)而改善實(shí)現(xiàn)一個(gè)對(duì)象池,一般會(huì)涉及到如下的類:對(duì)象池工廠(ObjectPoolFactory)類該類主要用于治理一樣類型和設(shè)置的對(duì)象池(ObjectPool),它一般包含如下兩個(gè)方法:·createPool:用于創(chuàng)立特定類型和設(shè)置的對(duì)象池;·destroyPool:用于釋放指定的對(duì)象池;同時(shí)為保證ObjectPoolFactory的單一實(shí)例,可以承受Singleton設(shè)計(jì)模式,見下述getInstance方法的實(shí)現(xiàn):publicstaticpublicstaticObjectPoolFactorygetInstance{if(poolFactory==null){poolFactory=newObjectPoolFactory;}returnpoolFactory;}2)參數(shù)對(duì)象(ParameterObject)類2)參數(shù)對(duì)象(ParameterObject)類該類主要用于封裝所創(chuàng)立對(duì)象池的一些屬性參數(shù),如池中可存放對(duì)象的數(shù)目的最大值(maxCount)、最小值(minCount)等。3)對(duì)象池(ObjectPool)類用于治理要被池化對(duì)象的借出和歸還,并通知PoolableObjectFactory完成相應(yīng)的工作。它一般包含如下兩個(gè)方法:·getObject:用于從池中借出對(duì)象;·returnObject:將池化對(duì)象返回到池中,并通知全部處于等待狀態(tài)的線程;4)池化對(duì)象工廠(PoolableObjectFactory)類該類主要負(fù)責(zé)治理池化對(duì)象的生命周期,就簡(jiǎn)潔來(lái)說(shuō),一般包括對(duì)象的創(chuàng)立及銷毀。該類同通用對(duì)象池的實(shí)現(xiàn)對(duì)象池的構(gòu)造和治理可以依據(jù)多種方式實(shí)現(xiàn)。最敏捷的方式是將池化對(duì)象的Class類型在對(duì)象池之外指定,即在ObjectPoolFactory類創(chuàng)立對(duì)象池時(shí),動(dòng)態(tài)指定該對(duì)象池所池化對(duì)象的Class類型,其實(shí)現(xiàn)代碼如下:...public...publicObjectPoolcreatePool(ParameterObjectparaObj,ClassclsType){returnnewObjectPool(paraObj,clsType);}...其中,paraObj參數(shù)用于指定對(duì)象池的特征屬性,clsType參數(shù)則指定了該對(duì)象池所存放對(duì)象的類型。對(duì)象池(ObjectPool)創(chuàng)立以后,下面就是利用它來(lái)治理對(duì)象了,具體實(shí)現(xiàn)如下:publicclassObjectPool{privateParameterObjectparaObj;//該對(duì)象池的屬性參數(shù)對(duì)象privateClassclsType;//該對(duì)象池中所存放對(duì)象的類型privateintcurrentNum=0;//該對(duì)象池當(dāng)前已創(chuàng)立的對(duì)象數(shù)目privateObjectcurrentObj;//該對(duì)象池當(dāng)前可以借出的對(duì)象privateVectorpool;//用于存放對(duì)象的池publicObjectPool(ParameterObjectparaObj,ClassclsType){this.paraObj=paraObj;this.clsType=clsType;pool=newVector;}publicObjectgetObject{if(pool.size<=paraObj.getMinCount){if(currentNum<=paraObj.getMaxCount){//假設(shè)當(dāng)前池中無(wú)對(duì)象可用,而且已創(chuàng)立的對(duì)象數(shù)目小于所限制的最大值,就利用//PoolObjectFactoryPoolableObjectFactoryobjFactory=PoolableObjectFactory.getInstance;currentObj=objFactory.createObject(clsType);currentNum++;}else{//假設(shè)當(dāng)前池中無(wú)對(duì)象可用,而且所創(chuàng)立的對(duì)象數(shù)目已到達(dá)所限制的最大值,//就只能等待其它線程返回對(duì)象到池中synchronized(this){try{wait;}catch(InterruptedExceptione){System.out.println(e.getMessage);e.printStackTrace;}currentObj=pool.firstElement;}}}else{//假設(shè)當(dāng)前池中有可用的對(duì)象,就直接從池中取出對(duì)象currentObj=pool.firstElement;}returncurrentObj;}publicvoidreturnObject(Objectobj){//確保對(duì)象具有正確的類型if(obj.isInstance(clsType)){pool.addElement(obj);synchronized(this){notifyAll;}}else{thrownewthrownewIllegalArgumentException(“該對(duì)象池不能存放指定的對(duì)象類型“);}}}從上述代碼可以看出,ObjectPool從上述代碼可以看出,ObjectPool利用一個(gè)java.util.Vector指定池化對(duì)象的Class類型及對(duì)象池的一些屬性。在有對(duì)象返回到對(duì)象池時(shí),它將檢查對(duì)象的類型是否正確。當(dāng)對(duì)象實(shí)例的創(chuàng)立并不在ObjectPool類中,而是由PoolableObjectFactory類的createObject具體實(shí)現(xiàn)如下:...publicObjectcreateObject(ClassclsType){Objectobj=null;try{obj=clsType.newInstance;}catch(Exceptione){e.printStackTrace;}returnobj;}...(Client)如何來(lái)使ClassStringBuffer:...//創(chuàng)立對(duì)象池工廠ObjectPoolFactorypoolFactory=ObjectPoolFactory.getInstance;//定義所創(chuàng)立對(duì)象池的屬性ParameterObjectparaObj=newParameterObject(2,1);//StringBufferObjectPoolpool=poolFactory.createPool(paraObj,StringBuffer.class);//StringBufferStringBufferbuffer=(StringBuffer)pool.getObject;//StringBufferbuffer.append(“hello“);System.out.println(buffer.toString);......但圓滿的是,由于需要使用大量的類型定型(cast)操作,再加上一些對(duì)Vector類的同步操作,使得它在某些狀況下對(duì)性能的改進(jìn)格外有限,尤其對(duì)那些創(chuàng)立周期比較短的對(duì)象。專用對(duì)象池的實(shí)現(xiàn)由于通用對(duì)象池的治理開銷比較大,某種程度上抵消了重用對(duì)象所帶來(lái)的大局部?jī)?yōu)勢(shì)。為解決該問題,可以承受專用對(duì)象池的方法。即對(duì)象池所池化對(duì)象的Class類型不是動(dòng)態(tài)指定的,而是預(yù)先就已指定。這樣,它在實(shí)ObjectPoolFactory和PoolableObjectFactory接融合到ObjectPoolClass類型仍為StringBuffer,而用省略號(hào)表示的地方,表示代碼同通用對(duì)象池的實(shí)現(xiàn)):publ

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論