对象池技术概述_第1页
对象池技术概述_第2页
对象池技术概述_第3页
对象池技术概述_第4页
对象池技术概述_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

commons-poolAPI,将用完的对象返回对象池中说,能够提高应用的性能。commons-dbcpcommons-poolcommons-dbcpcommons-pooltomcatJNDIjavax.sql.DataSource使用dbcporg.apachemons.dbcp.BasicDataSource。我们可以从这个称为“数据源”的类中调用getConnection方法来获得与数据外部使用者来说是透亮的。BasicDataSourcegetConnectionPoolingDataSourcegetConnectionPoolingDataSourceObjectPool,在getConnectionObjectPoolObjectPool.borrowObjectcommons-poolObjectPoolFactorydbcporg.apachemons.pool.PoolableObjectFactoryorg.apachemons.dbcp.PoolableConnectionFactorymakeObjectConnectionPoolableConnectionFactoryConnectionFactory,ConnectionFactory3ConnectionDriverConnectionFactoryDriverConnection。最近在做一个内部测试工具类的优化工作中接触到了连接池,对象池技术,将原事实证明,经过两次改造,原来一个比较大的测试类需要500多秒,第一次优化后只需要30080改造过程中的一些总结.么请使用对象池.内部原理简洁的说,就是将创立的对象放到一个容器中,用完之后不是销毁而是再放回该容器,让其他的对象调用,对象池中还涉及到一池中没有可用空闲对象时等待等等.之前,这里先理解几个概念:并且包含了用来创立池对象的工厂对象池对象:就是要放到池容器中的对象,理论上可以是任何对象.说的.池对象工厂(PoolableObjectFactory接口):用来创立池对象,将不用的池对象进展钝化(passivateObject),(activeObject),池对象进展验证(validateObject),对有问题的池对象进展销毁(destroyObject)等工作对象池中封装了创立,猎取,归还,销毁池对象的职责,固然这些工作都是通会对容器大小,存放时间,访问等待时间,空闲时间等等进展一些掌握,由于可以依据需要来调整这些设置.到达池容器的最大值,而对象池中又经没有空闲的对象,那么将会连续等待,个限度,对象池就会抛出特别.BasePoolableObjectFactory.addObject以备后用.为了确保对对象池的访问都是线程安全的,全部对容器的操作都必需放在synchronizedapachecommon-pool5:GenericObjectPoolGenericKeyedObjectPool,SoftReferenceObjectPool,StackObjectPool,StackKeyedObjectPool.五种对象池可分为两类,一类是无keykeyCursorableLinkedList来做容器,SoftReferenceObjectPoolArrayList用(SoftReferencejvm圾回收,从而具有很强的缓存力量.最终两种用Stackkey池是对前面池技术原理的一种简洁实现,带key的相对简单一些,它会将池对keykeykey,keymakeObject方法创立的对象根本上都是一模一样的,由于没法传递参数来对池对象进展定制.因此四种池对象的区分主要表达在内部的容器的区分,CursorableLinkedList内部用游标(cursor)来定位当前元素的双向链表,是非线程安全的,但是能满足对容器的并发修改.ArrayListreturnObject,销毁clear,close.下面是一些时序图:borrowObject:returnObject:invalidateObject:apachecommon-dbcpcommon-poolcommon-dbcpConnection,StatmentPoolableConnection,PoolablePreparedStatement.JavaJavaJavaJava_pool.returnObject(_key,this);这样一句,将连接对象放回连接池中.ObjectPool,KeyedObjectPool,由于一个数据库只对应一个连接,而执行操作的StatementSqlsql在对连接池的治理上,common-dbcp主要承受两种对象:PoolingDriver,另一个是PoolingDataSource,二者的区分是PoolingDriver连接池,即一个数据源对应一个连接池.下面是common-dbcp的构造关系:Java下面是参考了common-dbcpJava1./***创立连接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. *取得池化驱动器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. *从连接池中猎取数据库连接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){//依据数据库类型构建连接工厂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.//构造连接池ObjectPoolconnectionPool=newGenericObjectPool(null);newPoolableConnectionFactory(connectionFactory,connectionPool,70.null,null,false,true);71.72.//driver73.driver.registerPool(key,connectionPool);74.}75.//从连接池中拿一个连接returnDriverManager.getConnection(POOL_DRIVER_KEY+key);78. }79.80.}Java对象的生命周期大致包括三个阶段:对象的创立,对象的使用,对象的去除。因此,对象的生命周期长度可Java对象的生命周期大致包括三个阶段:对象的创立,对象的使用,对象的去除。因此,对象的生命周期长度可用如下的表达式表示:T=T1+T2+T3。其中T1T2T3其去除时间。由此,我们可以看出,只有T2是真正有效的时间,而T1、T3则是对象本身的开销。下面再看看T1、T3我们知道,Java对象是通过构造函数来创立的,在这一过程中,该构造函数链中的全部构造函数也都会被自Javal整数变量(byte、short、int、long0,float和double0.0,规律值设置成false。所以用new11一些操作所消耗时间的比照表运算操作例如标准化时间本地赋值i=n1.0实例赋值this.i=n1.2方法调用Funct5.9建对象NewObject980建数组Newint[10]31001980980166倍,而假设建一个数组所花费的时间就更多了。再看去除对象的过程。我们知道,Java语言的一个优势,就是Java程序员勿需再像C/C++程序员那样,显式地释放对象,而由称为垃圾收集器(GarbageCollector)的自动内存治理系统,定时或在内存凸现出缺乏时,自动回收垃圾对象所占的内存。凡事有利总也有弊,这虽然为Java程序设计者供给了极大的便利,但同时它也带来了较大的性能开销。这种开销包括两方面,首先是对象治理开销,GC为了能够正确释放对象,它必需监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等。其次,在GC开头回收“垃圾”对象时,系统会暂停应用程序的执行,而单独占用CPU。T1、T3的时间,而这些均可以通过对象池技术来实现。对象池技术的根本原理对象池技术根本原理的核心有两点:缓存和共享,即对于那些被频繁使用的对象,在使用完后,不马上将它们释放,而是将它们缓存起来,以供后续的应用程序重复使用,从而削减创立对象和释放对象的次数,进而改善实现一个对象池,一般会涉及到如下的类:对象池工厂(ObjectPoolFactory)类该类主要用于治理一样类型和设置的对象池(ObjectPool),它一般包含如下两个方法:·createPool:用于创立特定类型和设置的对象池;·destroyPool:用于释放指定的对象池;同时为保证ObjectPoolFactory的单一实例,可以承受Singleton设计模式,见下述getInstance方法的实现:publicstaticpublicstaticObjectPoolFactorygetInstance{if(poolFactory==null){poolFactory=newObjectPoolFactory;}returnpoolFactory;}2)参数对象(ParameterObject)类2)参数对象(ParameterObject)类该类主要用于封装所创立对象池的一些属性参数,如池中可存放对象的数目的最大值(maxCount)、最小值(minCount)等。3)对象池(ObjectPool)类用于治理要被池化对象的借出和归还,并通知PoolableObjectFactory完成相应的工作。它一般包含如下两个方法:·getObject:用于从池中借出对象;·returnObject:将池化对象返回到池中,并通知全部处于等待状态的线程;4)池化对象工厂(PoolableObjectFactory)类该类主要负责治理池化对象的生命周期,就简洁来说,一般包括对象的创立及销毁。该类同通用对象池的实现对象池的构造和治理可以依据多种方式实现。最敏捷的方式是将池化对象的Class类型在对象池之外指定,即在ObjectPoolFactory类创立对象池时,动态指定该对象池所池化对象的Class类型,其实现代码如下:...public...publicObjectPoolcreatePool(ParameterObjectparaObj,ClassclsType){returnnewObjectPool(paraObj,clsType);}...其中,paraObj参数用于指定对象池的特征属性,clsType参数则指定了该对象池所存放对象的类型。对象池(ObjectPool)创立以后,下面就是利用它来治理对象了,具体实现如下:publicclassObjectPool{privateParameterObjectparaObj;//该对象池的属性参数对象privateClassclsType;//该对象池中所存放对象的类型privateintcurrentNum=0;//该对象池当前已创立的对象数目privateObjectcurrentObj;//该对象池当前可以借出的对象privateVectorpool;//用于存放对象的池publicObjectPool(ParameterObjectparaObj,ClassclsType){this.paraObj=paraObj;this.clsType=clsType;pool=newVector;}publicObjectgetObject{if(pool.size<=paraObj.getMinCount){if(currentNum<=paraObj.getMaxCount){//假设当前池中无对象可用,而且已创立的对象数目小于所限制的最大值,就利用//PoolObjectFactoryPoolableObjectFactoryobjFactory=PoolableObjectFactory.getInstance;currentObj=objFactory.createObject(clsType);currentNum++;}else{//假设当前池中无对象可用,而且所创立的对象数目已到达所限制的最大值,//就只能等待其它线程返回对象到池中synchronized(this){try{wait;}catch(InterruptedExceptione){System.out.println(e.getMessage);e.printStackTrace;}currentObj=pool.firstElement;}}}else{//假设当前池中有可用的对象,就直接从池中取出对象currentObj=pool.firstElement;}returncurrentObj;}publicvoidreturnObject(Objectobj){//确保对象具有正确的类型if(obj.isInstance(clsType)){pool.addElement(obj);synchronized(this){notifyAll;}}else{thrownewthrownewIllegalArgumentException(“该对象池不能存放指定的对象类型“);}}}从上述代码可以看出,ObjectPool从上述代码可以看出,ObjectPool利用一个java.util.Vector指定池化对象的Class类型及对象池的一些属性。在有对象返回到对象池时,它将检查对象的类型是否正确。当对象实例的创立并不在ObjectPool类中,而是由PoolableObjectFactory类的createObject具体实现如下:...publicObjectcreateObject(ClassclsType){Objectobj=null;try{obj=clsType.newInstance;}catch(Exceptione){e.printStackTrace;}returnobj;}...(Client)如何来使ClassStringBuffer:...//创立对象池工厂ObjectPoolFactorypoolFactory=ObjectPoolFactory.getInstance;//定义所创立对象池的属性ParameterObjectparaObj=newParameterObject(2,1);//StringBufferObjectPoolpool=poolFactory.createPool(paraObj,StringBuffer.class);//StringBufferStringBufferbuffer=(StringBuffer)pool.getObject;//StringBufferbuffer.append(“hello“);System.out.println(buffer.toString);......但圆满的是,由于需要使用大量的类型定型(cast)操作,再加上一些对Vector类的同步操作,使得它在某些状况下对性能的改进格外有限,尤其对那些创立周期比较短的对象。专用对象池的实现由于通用对象池的治理开销比较大,某种程度上抵消了重用对象所带来的大局部优势。为解决该问题,可以承受专用对象池的方法。即对象池所池化对象的Class类型不是动态指定的,而是预先就已指定。这样,它在实ObjectPoolFactory和PoolableObjectFactory接融合到ObjectPoolClass类型仍为StringBuffer,而用省略号表示的地方,表示代码同通用对象池的实现):publ

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论