JedisPool技术Apachecommonpool的连接池

–>

 

=

=

 

JedisPool接受-Apache-common-pool的连接池技术
(https://blog.csdn.net/dlf123321/article/details/53907945)

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

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

PooledObjectFactory<T>,是一个泛型接口,里面有makeObjcet,destroyObject,validateObject等方法,就是生成一个对象,销毁一个对象,判定是否合法等的
PooledObject 是对基本对象的一个包装,包含基本对象的创建时间,状态等等
GenericObjectPool 里面包含了borrowObject与returnObject等方法

我们一般的从pool中取对象调用的是JedisPool的getResource方法
时序图如下:

在GenericObjectPool中有下面这个成员变量:
private final LinkedBlockingDeque<PooledObject<T>> idleObjects;
在上面时序图里第三步create前,会先在idleObjects里面找(idleObjects.pollFirst()),如果没有对象(这是一个队列),才去create,否则就直接返回idleobjects里面的。
释放连接,我们一般直接调用jedis的close方法。
如下图

最后那个LinkedBlockingDeque就是idleObjects。

当然,我上面的时序图,是我省略了很多很多的,但是主体就是上面的。
另外,pool的源码我自己看的也比较粗,如果文中有什么错误,还请各位大神一定指出。

有一个问题,如果我给pool设置的最少连接是20
那么这20个连接时连接池一开始就循环产生的,还是后面借一个,才生出一个?
换句话说就是勤生产还是懒生产。
答案是勤生产(准确的说是,自pool加载后timeBetweenEvictionRunsMillis毫秒开始生产这个连接对象,timeBetweenEvictionRunsMillis模式是30000毫秒)

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

   

[java] view plain copy
 

  1. //GenericObjectPool.java  
  2.    void ensureMinIdle() throws Exception {  
  3.        ensureIdle(getMinIdle(), true);  
  4.    }  
  5.   
  6.   
  7.    private void ensureIdle(int idleCount, boolean always) throws Exception {  
  8.        if (idleCount < 1 || isClosed() || (!always && !idleObjects.hasTakeWaiters())) {  
  9.            return;  
  10.        }  
  11.   
  12.   
  13.        while (idleObjects.size() < idleCount) {  
  14.            PooledObject<T> p = create();  
  15.            if (p == null) {  
  16.                // Can’t create objects, no reason to think another call to  
  17.                // create will work. Give up.  
  18.                break;  
  19.            }  
  20.            if (getLifo()) {  
  21.                idleObjects.addFirst(p);  
  22.            } else {  
  23.                idleObjects.addLast(p);  
  24.            }  
  25.        }  
  26.        if (isClosed()) {  
  27.            // Pool closed while object was being added to idle objects.  
  28.            // Make sure the returned object is destroyed rather than left  
  29.            // in the idle object pool (which would effectively be a leak)  
  30.            clear();  
  31.        }  
  32.    }  

 

 

 

=

=

=

本文来源 互联网收集,文章内容系作者个人观点,不代表 本站 对观点赞同或支持。如需转载,请注明文章来源,如您发现有涉嫌抄袭侵权的内容,请联系本站核实处理。

© 版权声明

相关文章