JedisPool技术-Apache-common-pool的连接池

=

=

JedisPool接受-Apache-common-pool的连接池技术

https://blog.csdn.net/dlf123321/article/details/53907945)

这篇博客,就不怎么分析源码了,咱们尽量把观察的层次提高一下,主要分析流程。

下图是JedisPool里面用到的一些类(有些类我省略了,例如closeable)

JedisPool技术-Apache-common-pool的连接池

PooledObjectFactory<T>,是一个泛型接口,里面有makeObjcet,destroyObject,validateObject等方法,就是生成一个对象,销毁一个对象,判定是否合法等的

PooledObject 是对基本对象的一个包装,包含基本对象的创建时间,状态等等

GenericObjectPool 里面包含了borrowObject与returnObject等方法

我们一般的从pool中取对象调用的是JedisPool的getResource方法

时序图如下:

JedisPool技术-Apache-common-pool的连接池

在GenericObjectPool中有下面这个成员变量:

private final LinkedBlockingDeque<PooledObject<T>> idleObjects;

在上面时序图里第三步create前,会先在idleObjects里面找(idleObjects.pollFirst()),如果没有对象(这是一个队列),才去create,否则就直接返回idleobjects里面的。

释放连接,我们一般直接调用jedis的close方法。

如下图

JedisPool技术-Apache-common-pool的连接池

最后那个LinkedBlockingDeque就是idleObjects。

当然,我上面的时序图,是我省略了很多很多的,但是主体就是上面的。

另外,pool的源码我自己看的也比较粗,如果文中有什么错误,还请各位大神一定指出。

有一个问题,如果我给pool设置的最少连接是20

那么这20个连接时连接池一开始就循环产生的,还是后面借一个,才生出一个?

换句话说就是勤生产还是懒生产。

答案是勤生产(准确的说是,自pool加载后timeBetweenEvictionRunsMillis毫秒开始生产这个连接对象,timeBetweenEvictionRunsMillis模式是30000毫秒)

timeBetweenEvictionRunsMillis毫秒秒检查一次连接池中空闲的连接,把空闲时间超过minEvictableIdleTimeMillis毫秒的连接断开,直到连接池中的连接数到minIdle为止

JedisPool技术-Apache-common-pool的连接池

//GenericObjectPool.java  
   void ensureMinIdle() throws Exception {  
       ensureIdle(getMinIdle(), true);  
   }  
  
  
   private void ensureIdle(int idleCount, boolean always) throws Exception {  
       if (idleCount < 1 || isClosed() || (!always && !idleObjects.hasTakeWaiters())) {  
           return;  
       }  
  
  
       while (idleObjects.size() < idleCount) {  
           PooledObject<T> p = create();  
           if (p == null) {  
               // Can't create objects, no reason to think another call to  
               // create will work. Give up.  
               break;  
           }  
           if (getLifo()) {  
               idleObjects.addFirst(p);  
           } else {  
               idleObjects.addLast(p);  
           }  
       }  
       if (isClosed()) {  
           // Pool closed while object was being added to idle objects.  
           // Make sure the returned object is destroyed rather than left  
           // in the idle object pool (which would effectively be a leak)  
           clear();  
       }  
   }  

=

=

=

原文 

http://fantaxy025025.iteye.com/blog/2424076

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » JedisPool技术-Apache-common-pool的连接池

分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址