Apache Commons-pool实现对象池(包括带key对象池)

简单聊聊对象池及Apache Commons Pool的使用 本文我们主要学习了Apache Commons Pool是什么,以及核心组件,还有如何使用,不涉及原理和源码的分析。在知道了如何使用后我们后面才会去分析源码。 阅读详情

Commons-pool是一个apache开源组织下的众多项目的一个。其被广泛地整合到众多需要对象池功能的项目中。

官网:http://commons.apache.org/proper/commons-pool/

本文是commons-pool的一个简单应用,包括不带key的池和带key的池。带key的池是把key相同的池对象放在一起池里,也就是说有多少个key就有多少个池。

不带key的池是生产完全一致的对象放在池里,但是有时候,单用对池内所有对象一视同仁的对象池,并不能解决的问题。例如,对于一组某些参数设置不同的同类对象――比如一堆指向不同地址的 java.net.URL对象或者一批代表不同语句的java.sql.PreparedStatement对象,用这样的方法池化,就有可能取出不合用 的对象的麻烦。这里对带key的池也做了简单的例子。

Commons-pool将对象池化的工作安排给了三类对象:

1.      PoolableObjectFactory(KeyedPoolableObjectFactory):用于管理被池化对象的产生,激活,挂起,检验和销毁。

2.      ObjectPool(KeyedObjectPool):用于管理要被池化的对象的接触和归还,并通过PoolableObjectFactory完成相应的操作。

3.      ObjectPoolFactory(KeyedObjectPoolFactory):ObjectPool的工厂,里边有createPool()方法,用于大量生成相同类型和设置的池。

1.下载相关jar包以及文档

下载API以及相关jar包,本文用到的是目前最新的1.6版本。
下载源码以及官方例子,可供参考。

2.编写测试例子,新建项目只需要导入commons-pool-1.6.jar一个就可以

1)实体对象BaseObject.java

[java]  view plain copy
  1. public class BaseObject {  
  2.   
  3.     //记录从池中取出次数  
  4.     private int num;  
  5.     private boolean active;  
  6.       
  7.     public BaseObject(){  
  8.         active = true;  
  9.         System.out.println("new BaseObject!!!!!");  
  10.     }  
  11. //省略get set  

2)管理池里对象的产生,激活,挂起,检验和销毁的工厂类

工厂类里的方法内部可以自己根据业务逻辑去写,例如:
makeObject()方法内部可以查询数据库封装成对象,注意一次只能创建一个池对象。
validateObject()方法内部可以自己验证该对象是否正在使用,比如可以通过对象的状态验证。
这是不带key的工厂类TestPoolableFactory.java
[java]  view plain copy
  1. public class TestPoolableFactory implements PoolableObjectFactory {  
  2.   
  3.     //重新初始化实例返回池  
  4.     @Override  
  5.     public void activateObject(Object arg0) throws Exception {  
  6.         ((BaseObject)arg0).setActive(true);  
  7.     }  
  8.   
  9.     //销毁被破坏的实例  
  10.     @Override  
  11.     public void destroyObject(Object arg0) throws Exception {  
  12.         arg0 = null;  
  13.     }  
  14.   
  15.     //创建一个实例到对象池  
  16.     @Override  
  17.     public Object makeObject() throws Exception {  
  18.         BaseObject bo = new BaseObject();  
  19.         return bo;  
  20.     }  
  21.   
  22.     //取消初始化实例返回到空闲对象池  
  23.     @Override  
  24.     public void passivateObject(Object arg0) throws Exception {  
  25.         ((BaseObject)arg0).setActive(false);  
  26.     }  
  27.   
  28.     //验证该实例是否安全  
  29.     @Override  
  30.     public boolean validateObject(Object arg0) {  
  31.         if(((BaseObject)arg0).isActive())  
  32.             return true;  
  33.         else  
  34.             return false;  
  35.     }  
  36.   
  37. }  


这是带key的工厂类TestKeyPoolableFactory.java
[java]  view plain copy
  1. public class TestKeyPoolableFactory implements KeyedPoolableObjectFactory<String, BaseObject> {  
  2.   
  3.     //重新初始化实例返回池  
  4.     @Override  
  5.     public void activateObject(String arg0, BaseObject arg1) throws Exception {  
  6.         ((BaseObject)arg1).setActive(true);  
  7.     }  
  8.   
  9.     //销毁被破坏的实例  
  10.     @Override  
  11.     public void destroyObject(String arg0, BaseObject arg1) throws Exception {  
  12.         arg1 = null;  
  13.     }  
  14.   
  15.     //创建一个实例到对象池  
  16.     @Override  
  17.     public BaseObject makeObject(String arg0) throws Exception {  
  18.         //这里从数据库里查询出使用次数最少的配置  
  19.         BaseObject bo = new BaseObject();  
  20.         bo.setNum(0);  
  21.         return bo;  
  22.     }  
  23.   
  24.     //取消初始化实例返回到空闲对象池  
  25.     @Override  
  26.     public void passivateObject(String arg0, BaseObject arg1) throws Exception {  
  27.         ((BaseObject)arg1).setActive(false);  
  28.     }  
  29.   
  30.     //验证该实例是否安全 true:正在使用  
  31.     @Override  
  32.     public boolean validateObject(String arg0, BaseObject arg1) {  
  33.         //这里可以判断实例状态是否可用  
  34.         if(((BaseObject)arg1).isActive())  
  35.             return true;  
  36.         else  
  37.             return false;  
  38.     }  
  39. }  

3)测试main方法

不带key的main方法类PoolTest.java
[java]  view plain copy
  1. public class PoolTest {  
  2.   
  3.     public static void main(String[] args) {  
  4.         BaseObject bo = null;  
  5.         PoolableObjectFactory factory = new TestPoolableFactory();  
  6.         GenericObjectPool pool = new GenericObjectPool(factory);  
  7.         //这里两种池都可以,区别下文会提到  
  8.         //ObjectPool pool = new StackObjectPool(factory);  
  9.         try {  
  10.             for(int i = 0; i < 5; i++) {  
  11.                 System.out.println("\n==========="+i+"===========");  
  12.                 System.out.println("池中处于闲置状态的实例pool.getNumIdle():"+pool.getNumIdle());  
  13.                 //从池里取一个对象,新创建makeObject或将以前闲置的对象取出来  
  14.                 bo = (BaseObject)pool.borrowObject();  
  15.                 System.out.println("bo:"+bo);  
  16.                 System.out.println("池中所有在用实例数量pool.getNumActive():"+pool.getNumActive());  
  17.                 if((i%2) == 0) {  
  18.                     //用完之后归还对象  
  19.                     pool.returnObject(bo);  
  20.                     System.out.println("归还对象!!!!");  
  21.                 }  
  22.             }  
  23.         } catch (Exception e) {  
  24.             e.printStackTrace();  
  25.         } finally {  
  26.             try {  
  27.                 if(bo != null) {  
  28.                     pool.returnObject(bo);  
  29.                 }  
  30.                 //关闭池  
  31.                 pool.close();  
  32.             } catch (Exception e) {  
  33.                 e.printStackTrace();  
  34.             }  
  35.         }  
  36.     }  
  37. }  


输出结果:

[plain]  view plain copy
  1. ===========0===========  
  2. 池中处于闲置状态的实例pool.getNumIdle():0  
  3. new BaseObject!!!!!  
  4. bo:common.keypool.BaseObject@1fdc96c  
  5. 池中所有在用实例数量pool.getNumActive():1  
  6. 归还对象!!!!  
  7.   
  8. ===========1===========  
  9. 池中处于闲置状态的实例pool.getNumIdle():1  
  10. bo:common.keypool.BaseObject@1fdc96c  
  11. 池中所有在用实例数量pool.getNumActive():1  
  12.   
  13. ===========2===========  
  14. 池中处于闲置状态的实例pool.getNumIdle():0  
  15. new BaseObject!!!!!  
  16. bo:common.keypool.BaseObject@124bbbf  
  17. 池中所有在用实例数量pool.getNumActive():2  
  18. 归还对象!!!!  
  19.   
  20. ===========3===========  
  21. 池中处于闲置状态的实例pool.getNumIdle():1  
  22. bo:common.keypool.BaseObject@124bbbf  
  23. 池中所有在用实例数量pool.getNumActive():2  
  24.   
  25. ===========4===========  
  26. 池中处于闲置状态的实例pool.getNumIdle():0  
  27. new BaseObject!!!!!  
  28. bo:common.keypool.BaseObject@a20892  
  29. 池中所有在用实例数量pool.getNumActive():3  
  30. 归还对象!!!!  

这里的池声明用ObjectPool或者GenericObjectPool的区别在于:

ObjectPool这种对象池的特点是:

  • 可以为对象池指定一个初始的参考大小(当空间不够时会自动增长)。
  • 在对象池已空的时候,调用它的borrowObject方法,会自动返回新创建的实例。
  • 可以为对象池指定一个可保存的对象数目的上限。达到这个上限之后,再向池里送回的对象会被自动送去回收。

GenericObjectPool这种对象池的特色是:

  • 可以设定最多能从池中借出多少个对象。
  • 可以设定池中最多能保存多少个对象。
  • 可以设定在池中已无对象可借的情况下,调用它的borrowObject方法时的行为,是等待、创建新的实例还是抛出异常。
  • 可以分别设定对象借出和还回时,是否进行有效性检查。
  • 可以设定是否使用一个单独的线程,对池内对象进行后台清理。
  • ……
这些参数可以通过一个Config类来管理,然后通过 GenericObjectPool的setConfig(Config conf)方法来设置自定义的Config类。下面附上setConfig方法源码,就知道Config类需要哪些参数了:

源码GenericKeyedObjectPool.java类内部的setConfig方法

[java]  view plain copy
  1. /** 
  2.      * Sets the configuration. 
  3.      * @param conf the new configuration to use. 
  4.      * @see GenericKeyedObjectPool.Config 
  5.      */  
  6.     public synchronized void setConfig(GenericKeyedObjectPool.Config conf) {  
  7.         setMaxIdle(conf.maxIdle);  
  8.         setMaxActive(conf.maxActive);  
  9.         setMaxTotal(conf.maxTotal);  
  10.         setMinIdle(conf.minIdle);  
  11.         setMaxWait(conf.maxWait);  
  12.         setWhenExhaustedAction(conf.whenExhaustedAction);  
  13.         setTestOnBorrow(conf.testOnBorrow);  
  14.         setTestOnReturn(conf.testOnReturn);  
  15.         setTestWhileIdle(conf.testWhileIdle);  
  16.         setNumTestsPerEvictionRun(conf.numTestsPerEvictionRun);  
  17.         setMinEvictableIdleTimeMillis(conf.minEvictableIdleTimeMillis);  
  18.         setTimeBetweenEvictionRunsMillis(conf.timeBetweenEvictionRunsMillis);  
  19.     }  

源码GenericObjectPool.java类内部的setConfig方法

[java]  view plain copy
  1. /** 
  2.      * Sets my configuration. 
  3.      * 
  4.      * @param conf configuration to use. 
  5.      * @see GenericObjectPool.Config 
  6.      */  
  7.     public void setConfig(GenericObjectPool.Config conf) {  
  8.         synchronized (this) {  
  9.             setMaxIdle(conf.maxIdle);  
  10.             setMinIdle(conf.minIdle);  
  11.             setMaxActive(conf.maxActive);  
  12.             setMaxWait(conf.maxWait);  
  13.             setWhenExhaustedAction(conf.whenExhaustedAction);  
  14.             setTestOnBorrow(conf.testOnBorrow);  
  15.             setTestOnReturn(conf.testOnReturn);  
  16.             setTestWhileIdle(conf.testWhileIdle);  
  17.             setNumTestsPerEvictionRun(conf.numTestsPerEvictionRun);  
  18.             setMinEvictableIdleTimeMillis(conf.minEvictableIdleTimeMillis);  
  19.             setTimeBetweenEvictionRunsMillis(conf.timeBetweenEvictionRunsMillis);  
  20.             setSoftMinEvictableIdleTimeMillis(conf.softMinEvictableIdleTimeMillis);  
  21.             setLifo(conf.lifo);  
  22.         }  
  23.         allocate();  
  24.     }  

1.      参数maxActive指明能从池中借出的对象的最大数目。如果这个值不是正数,表示没有限制。

2.      参数whenExhaustedA ction指定在池中借出对象的数目已达极限的情况下,调用它的borrowObject方法时的行为。可以选用的值有:

  • GenericObjectPool.WHEN_EXHAUSTED_BLOCK,表示等待;
  • GenericObjectPool.WHEN_EXHAUSTED_GROW,表示创建新的实例(不过这就使maxActive参数失去了意义);
  • GenericObjectPool.WHEN_EXHAUSTED_FAIL,表示抛出一个java.util.NoSuchElementException异常。

3.      参数maxWait指明若在对象池空时调用borrowObject方法的行为被设定成等待,最多等待多少毫秒。如果等待时间超过了这个数值,则会抛出一个java.util.NoSuchElementException异常。如果这个值不是正数,表示无限期等待。

4.      参数testOnBorrow设定在借出对象时是否进行有效性检查。

5.      参数testOnBorrow设定在还回对象时是否进行有效性检查。

6.      参数timeBetweenEvictionRunsMillis,设定间隔每过多少毫秒进行一次后台对象清理的行动。如果这个值不是正数,则实际上不会进行后台对象清理。

7.      参数minEvictableIdleTimeMillis,设定在进行后台对象清理时,视休眠时间超过了多少毫秒的对象为过期。过期的对象将被回收。如果这个值不是正数,那么对休眠时间没有特别的约束。

8.      参数testWhileIdle,则设定在进行后台对象清理时,是否还对没有过期的池内对象进行有效性检查。不能通过有效性检查的对象也将被回收。

9.      参数lifo,池对象的放入和取出默认是后进先出的原则,默认是true,代表后进后出,设置为false代表先进先出。


带key的main方法类KeyPoolTest.java

[java]  view plain copy
  1. public class KeyPoolTest {  
  2.   
  3.     public static void main(String[] args) {  
  4.           
  5.         BaseObject bo = null;  
  6.         BaseObject bo1 = null;  
  7.         BaseObject bo2 = null;  
  8.           
  9.         KeyedPoolableObjectFactory<String, BaseObject> keyFactory = new TestKeyPoolableFactory();  
  10.         GenericKeyedObjectPool<String, BaseObject> keyPool = new GenericKeyedObjectPool<String, BaseObject>(keyFactory);  
  11.         //keyPool.setLifo(false);  
  12.         try {  
  13.             //这里添加池对象,只需要传入key就会默认调用makeObject()方法创建一个对象  
  14.             keyPool.addObject("一级");  
  15.             keyPool.addObject("二级");  
  16.             //这里注释掉,不初始创建这个键的池对象  
  17.             //keyPool.addObject("三级");  
  18.             System.out.println("池中处于闲置状态的实例pool.getNumIdle():"+keyPool.getNumIdle());  
  19.             for (int i = 0; i < 5; i++) {  
  20.                 //从池里取对象  
  21.                 bo = keyPool.borrowObject("一级");  
  22.                 bo.setNum(bo.getNum()+1);  
  23.                 System.out.println("一级"+i+"-------"+bo+"-------"+bo.getNum());  
  24.                   
  25.                 bo1 = keyPool.borrowObject("二级");  
  26.                 bo1.setNum(bo1.getNum()+1);  
  27.                 System.out.println("二级"+i+"-------"+bo1+"-------"+bo1.getNum());  
  28.                 //上边注释掉的那行代码,这里取对象的时候如果没有闲置对象,也会默认去创建一个key="三级"的池对象  
  29.                 bo2 = keyPool.borrowObject("三级");  
  30.                 bo2.setNum(bo2.getNum()+1);  
  31.                 System.out.println("三级"+i+"-------"+bo2+"-------"+bo2.getNum());  
  32.                   
  33.                 if(i<3) {  
  34.                     //用完之后归还对象  
  35.                     keyPool.returnObject("一级", bo);  
  36.                     keyPool.returnObject("二级", bo1);  
  37.                     keyPool.returnObject("三级", bo2);  
  38.                     System.out.println("归还对象!!!");  
  39.                 }  
  40.             }  
  41.             //当前池里的实例数量  
  42.             System.out.println("池中所有在用实例pool.getNumActive():"+keyPool.getNumActive());  
  43.             //当前池里的处于闲置状态的实例  
  44.             System.out.println("池中处于闲置状态的实例pool.getNumIdle():"+keyPool.getNumIdle());  
  45.         } catch (Exception e) {  
  46.             e.printStackTrace();  
  47.         }  
  48.         //这里就不写finally了,偷懒了,这里应该关闭池的  
  49.     }  
  50. }  

输出结果:

[plain]  view plain copy
  1. new BaseObject!!!!!  
  2. new BaseObject!!!!!  
  3. 池中处于闲置状态的实例pool.getNumIdle():2  
  4. 一级0-------common.keypool.BaseObject@158b649-------1  
  5. 二级0-------common.keypool.BaseObject@127734f-------1  
  6. new BaseObject!!!!!  
  7. 三级0-------common.keypool.BaseObject@1037c71-------1  
  8. 归还对象!!!  
  9. 一级1-------common.keypool.BaseObject@158b649-------2  
  10. 二级1-------common.keypool.BaseObject@127734f-------2  
  11. 三级1-------common.keypool.BaseObject@1037c71-------2  
  12. 归还对象!!!  
  13. 一级2-------common.keypool.BaseObject@158b649-------3  
  14. 二级2-------common.keypool.BaseObject@127734f-------3  
  15. 三级2-------common.keypool.BaseObject@1037c71-------3  
  16. 归还对象!!!  
  17. 一级3-------common.keypool.BaseObject@158b649-------4  
  18. 二级3-------common.keypool.BaseObject@127734f-------4  
  19. 三级3-------common.keypool.BaseObject@1037c71-------4  
  20. new BaseObject!!!!!  
  21. 一级4-------common.keypool.BaseObject@1df073d-------1  
  22. new BaseObject!!!!!  
  23. 二级4-------common.keypool.BaseObject@1546e25-------1  
  24. new BaseObject!!!!!  
  25. 三级4-------common.keypool.BaseObject@b66cc-------1  
  26. 池中所有在用实例pool.getNumActive():6  
  27. 池中处于闲置状态的实例pool.getNumIdle():0  

通过输出结果可以看出:

1.对象取出之后可以对对象进行更改,再放回池里这个更改是保留的。

2.池对象的放入和取出默认是后进先出的原则,可以通过池pool的setLifo(boolean lifo)方法设置,默认是true,代表后进先出,设置为false代表先进先出。如果为了池对象使用均衡,推荐使用false。


原文链接:http://blog.youkuaiyun.com/bhy5683/article/details/8776498

得利捷datalogic扫码枪调试说明 针对得利捷datalogic扫码枪快速调试并,可以根据详细步骤设置扫码枪,并配有tcp调试助手辅以验证,以达到快速调试完成扫码枪的工作。 阅读详情

相关推荐

N32G003学习——第九章 第三节1 串口 发送

经过第九章前2节的学习,基础打下之后,开始敲代码。

qq_34525008的博客 1034

Apache Commons Pool :介绍与使用

默认情况下,闲置对象不会自动过期,除非设置了逐出线程参数(如设置可以明确指定闲置对象的过期时间。通过调优minIdle和maxIdle可以更好地控制池中对象的生命周期。是一个高效的对象池管理库,广泛用于连接池、线程池等需要管理资源的场景。其配置包括最小闲置数 (minIdle)和逐出线程 (Evictor)参数。最小闲置数 (minIdle定义对象池中需要保持的最小空闲对象数。如果空闲对象少于该值,池会创建新的对象,直到满足minIdle。逐出线程 (Evictor周期性检查并清理空闲对象。

Thinking In Java 2832

Docker版OnlyOffice中文字体配置全攻略:从字号调整到字体添加

本文详细介绍了在Docker版OnlyOffice中配置中文字体和调整字号的完整方案。通过容器内操作和配置文件修改,实现中文标准字号映射及思源、阿里巴巴等优质字体的集成,提升文档排版的规范性和专业性。特别针对企业级部署提供了性能优化建议和常见问题解决方案。

weixin_28309571的博客 137

apache-common-pool2简单使用和源码分析

至此apache-common-pool2的部分关键代码分析完毕,对连接池有了更多的理解,个人使用案例参考之前做过另一篇笔记。

weixin_43316101的博客 1934

无需UMAT:基于Abaqus内置模型实现形状记忆聚合物结构的热-力耦合仿真

本文详细介绍了如何利用Abaqus内置模型实现形状记忆聚合物(SMP)的热-力耦合仿真,无需编写复杂的UMAT子程序。通过广义Maxwell模型和Neo-Hookean模型的组合应用,结合完整的热-力耦合分析流程,帮助工程师高效模拟SMP的形状记忆行为。文章还提供了工程应用案例和常见问题解决方案,为相关领域的研究和设计提供实用指导。

weixin_34005090的博客 117

25年PINN创新点大盘点!

在科研论文的激烈角逐中,想轻松产出高含金量成果?物理信息神经网络(PINN)堪称“宝藏研究方向”,是冲击高分区论文的绝佳赛道!对于渴望发表优质论文的科研伙伴,这三大研究路径值得重点关注。首先是自适应PINN,在PINN训练过程中,物理方程与实测数据间的矛盾常常导致权重调节困难,而恰好直击这一痛点,是极具价值的研究方向。其次,同样前景广阔,传统多物理场同时训练效果欠佳,如今分阶段训练方法脱颖而出,成效显著且竞争较小。最后,探索及多任务学习等技术的融合,能实现优势叠加,碰撞出创新火花。

Malaai的博客 1970

深入理解Apache Commons Pool2池化技术

Apache Commons Pool2是Apache Commons下的一个开源项目,主要用于实现和管理对象池。对象池是一种常见的设计模式,通过复用来分摊昂贵对象的创建和销毁代价,从而优化资源利用和提高应用程序性能。Commons Pool2提供了一套用于实现对象池化的API,并内置了多种各具特色的对象池实现。其被广泛应用在各种数据库连接池、线程池以及请求分发池中。其实现提供了一些参数来控制对象池的行为,例如最大池化对象数、最大空闲时间、最小空闲数等,可以根据不同的应用场景进行灵活配置。

码到三十五 8242

(超全面,超基础)Kriging插值推导理论笔记,算法,普通克里金

最近老师让我再重新推导一下克里金插值的方法如何求出预测结果,于是我又无数次地打开了大神的推导原理过程链接????:克里金(Kriging)插值的原理与公式推导 作者:xg1990,但是不可避免地在推导过程中,数学知识基础薄弱的我卡住在一些公式推导的步骤中。 所以就想基于上面大神的推导过程,将里面的推导写得更具体些,当然觉得毫不吃力可以进行推导的大神们可以不看我的注释,直接点开链接看就好。 我看到csdn中很多关于克里金推导的博客里面的内容直接截屏或者复制了上面链接里大神发表的内容,也不注

Olivel1997的博客 1万+

java 对象池 apache_Apache Commons-pool实现对象池(包括带key对象池)

public class TestPoolableFactory implementsPoolableObjectFactory {//重新初始化实例返回池@Overridepublic void activateObject(Object arg0) throwsException {((BaseObject)arg0).setActive(true);}//销毁被破坏的实例@Overridep...

weixin_42593549的博客 297

字节最新开源模型 DA3(Depth Anything 3)使用教程(一)从任意视角恢复视觉空间

本文介绍DepthAnything3(DA3)模型,一种能够从任意视觉输入中预测几何结构的创新解决方案。DA3采用Transformer骨干网络,通过统一的深度光线表示简化学习过程,支持单目/多视角深度估计、姿态估计和3D高斯预测等多项任务。模型系列包含基础版、度量级和单目专用版本,其中嵌套版本DA3NESTED-GIANT-LARGE表现最佳。代码库提供交互界面、CLI工具和多格式导出功能,支持模块化扩展。实验表明DA3在各项任务上超越现有模型,所有训练数据均来自公开学术数据集。

2506_90492529的博客 2549

【AI技术赋能有限元分析应用实践】Abaqus有限元分析与深度学习结合20个案例与有限元分析数据来源方法说明

结合 Abaqus 和深度学习,数据的获取和处理是关键的一步。通过从仿真、实验、公开数据库或合成数据中获取数据,经过预处理后,可以将其用于训练深度学习模型。最终,将训练好的深度学习模型与 Abaqus 集成,用于材料行为预测、结构优化、非线性分析、损伤预测等任务,从而提升仿真效率和精度。

源代码杀手的博客 3213

Apache对象池插件common-pool学习小结

一、背景        对于使用面向对象语言开发软件的童鞋们都知道,对象是一个十分重要的概念,用Thinking in Java绪论里面的话说:一切皆是对象。        因为对象的重要性,所以在某些大型的应用系统中,对象会被频繁的创建并使用,这就会导致开发人员需要对系统的性能进行调优,特别是在系统耗时方法更是需要着重优化。幸好,有Apache这样一个组织,给奋斗在第一线的广大IT民工提...

侠客行 338

lvgl 9虚拟键盘控件 (lv_keyboard) 使用指南

是 LittlevGL 提供的一个虚拟键盘控件,适用于在图形界面中输入文本。与按钮矩阵类似,虚拟键盘预定义了多个键位布局,支持多种模式和自定义键位映射,能够满足各种文本输入需求。通过与文本区域 (Text Area) 的结合,键盘能够自动将输入的字符传送到指定区域。控件是 LittlevGL 提供的强大虚拟键盘解决方案,适用于任何需要文本输入的界面。通过预定义的键盘模式、自定义键位映射和文本区域自动填充功能,可以大大提升用户输入体验。无论是在嵌入式系统的用户界面中,还是在其他需要虚拟键盘的应用中,

m0_62599305的博客 2185

java对象池commons-pool-1.6详解

java对象池commons-pool java对象池commons-pool-1.6详解(一) 对象的创建和销毁在一定程度上会消耗系统的资源,虽然jvm的性能在近几年已经得到了很大的提高,对于多数对象来说,没有必要利用对象池技术来进行对象的创建和管理。但是对于有些对象来说,其创建的代价还是比较昂贵的,比如线程、tcp连接、rpc连接、数据库连接等对象,因此对象池技术还是有其存在的意义。 Apache-commons-pool-1.6提供的对象池主要有两种:一种是带Key的对象池,这种带Key的对象池是把相

huapro.vip的程序人生 334

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

java对象池commons-pool-1.6详解(二)

上篇文章 我们详细介绍了commons-pool-1.6 java对象池的原理和基本概念,本文详细介绍不带key的对象池(ObjectPool)具体使用。 1、重点接口介绍: 在Apache-commons-pool-1.6中,定义了三个顶级接口:ObjectPool、ObjectPoolFactory、PoolableObjectFactory;其中ObjectPool和ObjectPo

赶路人儿 1483

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

java对象池commons-pool-1.6详解(三)

前面讲述了不带key的对象池,本文重点介绍另一种对象池——带key的,这种对象池在实际应用中更加广泛。例如:我们在rpc的系统中,需要对rpc对象进行池化提升其效率,但在实际环境中我们通常考虑ha,会对一个rpc服务在不同服务器上部署多个,这种情况下如果使用普通的对象池就会把所有服务器上部署的rcp服务对象放到一个池子中,不利于负载均衡,使用带有key的对象池可以很好做到负载均衡和池化对象。 一

赶路人儿 1878

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

通用对象池化框架Apache Commons Pool 2简析

前言 我们知道,创建Java对象会涉及到对象初始化、内存分配、类加载等多个步骤。当对象比较重量级时,频繁创建对象会带来可观的性能开销,所以在上古时代(大雾)就产生了对象池化(object pooling)的技术。顾名思义,对象池中维护了一批已经创建好的重量级对象,要使用时就从中取出一个,用完就归还到池里,通过复用对象来提高效率。 我们在日常工作中时刻都在应用池化技术:线程池、数据库连接池、网络连接...

LittleMagic's Blog 2814

Apache对象池commons.pool使用

背景: 要抓取网络数据,使用了chromedriver。因为创建和销毁驱动耗时间,所以考虑使用对象池管理。刚好apache提供了开源库,不用重复造轮子了。并且支持多key的池子。如:手机端的驱动放一个池子中,PC端的驱动放一个池子中。简单使用如下: maven引入: <dependency> <groupId>org.apache.commons</groupId&...

何超杰的博客 915

对象池 commons-pool2

title: 对象池 commons-pool2 date: 2021-08-01 13:48:21 tags: Java 池化技术 1 前言 池化技术是性能调优的重要措施,池化的思想是把对象放到池子里面,当要使用的时候从池子里面拿对象,用完之后在放回池子里面。这样可以降低资源分配和释放资源的开销,从而提升性能。 在实际的项目中,我们每天都会接触到池化技术,例如: 对象池:通过复用对象,减少对象创建、垃圾回收的开销 线程池:通过复用线程来提升性能 连接池:如数据库连接池、Redis连接池、HTT.

Little_fxc的博客 2508

commons-pool2对象池实战

1.why 我们在服务器开发的过程中,往往会有一些对象,它的创建和初始化需要的时间比较长,比如数据库连接,网络IO,大数据对象等。在大量使用这些对象时,如果不采用一些技术优化,就会造成一些不可忽略的性能影响。一种办法就是使用对象池,每次创建的对象并不实际销毁,而是缓存在对象池中,下次使用的时候,不用再重新创建,直接从对象池的缓存中取即可。为了避免重新造轮子,我们可以使用优秀的开源对象池化组件apache-commons-pool2,它对对象池化操作进行了很好的封装,我们只需要根据自己的业务需求重写或实现部分

qq_40321119的博客 972

apache commons pool

apache commons下的pool 其中的borrowObject函数源代码显示其产生可用对象的过程:     如果stack中有空闲的对象,则pop对象,激活对象(activate函数),验证对象(validate函数)。最终将合格的对象返回给client。                        若对象在这个流程中出错,则在从stack中取出一个,并执行相同的流程。如此循环,

xsi64的专栏 529

Java 对象池设计的性能分析——Apache Commons Pool 与对象复用策略的量化对比

量化先行:不确定是否需要池化时,写一段 JMH 基准测试,对比池化前后的吞吐和 GC 频率。重量对象池化、轻量对象直接 new:一个简单的判断标准:如果一次创建耗时 > 10ms 或对象大小 > 50KB,考虑池化。StringBuilder、ArrayList 之类绝不池化。归还可靠性是池化工程的基石:用装饰器模式或 try-with-resources 保证借出的一定会归还。一次泄漏就能让整个池耗尽。

alex_goden的博客 4767
上一篇: dns(bind)配置详解(三)
下一篇: 消息中间件 activeMQ的源码分析 之 开篇
乐动心情
博客等级 码龄16年 36粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值