`
fantaxy025025
  • 浏览: 1308873 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

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

 
阅读更多

 

=

=

 

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

下图是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.    }  

 

 

 

=

=

=

分享到:
评论

相关推荐

    Jedis-Common-Pool

    导入后,可以通过Jedis类的静态方法`JedisPoolConfig`配置连接池参数,然后创建`JedisPool`实例,使用`JedisPool`获取`Jedis`对象进行Redis操作,操作完成后,需要将`Jedis`对象返回给连接池,以便后续使用。...

    jedis 和 common-pool

    在Jedis 2.7.0版本中,它使用了Apache Commons Pool 2.3来实现连接池功能。解压`pool2-2.3.zip`后,你会得到`commons-pool2-2.3.jar`,同样需要将其添加至项目类路径。使用Jedis连接池的基本配置如下: 1. 引入依赖...

    redis3.2+jedis2.8.jar+common-pool2.jar+common-pool2-source.rar

    JedisPool pool = new JedisPool(config, "localhost", 6379); try (Jedis jedis = pool.getResource()) { jedis.set("key", "value"); String value = jedis.get("key"); } ``` Jedis还支持事务操作,可以一次...

    commons-pool2-2.11.1-bin.zip

    DBCP(DataBase Connection Pool)是 apache common上的一个 java 连接池项目,也是 tomcat 使用的连接池组件,依赖 于Jakarta commons-pool 对象池机制,DBCP可以直接的在应用程序中使用。 使用DBCP会用到commons-...

    jedis+commons-pool2的jar包.rar

    在这个例子中,我们首先创建了一个JedisPoolConfig实例,设置了连接池的最大和最小连接数,然后用这个配置创建了JedisPool。在main方法中,我们从池中获取一个Jedis实例,进行set和get操作,最后确保Jedis实例被正确...

    jedis2.9-common-pool

    《Jedis 2.9与Common Pool:Redis客户端与连接池详解》 Redis,作为一款高性能的Key-Value存储系统,被广泛应用于缓存、消息队列等多种场景。在Java开发中,Jedis是一个非常流行的Redis客户端库,而Jedis 2.9版本则...

    commons-pool2-2.8.1.jar

    《Apache Commons Pool 2.8.1:高效对象池实现详解》 Apache Commons Pool 是一个广泛使用的开源组件,主要用于提供对象池化的实现。在Java世界里,对象池化是一种优化资源管理的重要技术,通过复用已创建的对象,...

    最新连接redis数据库连接池commons-pool-2.5.0

    需要使用Redis连接池的话,还需commons-pool包,提供了强大的功能,包含最新的jar包

    redis连接池jar jedis+common

    在Redis中,Jedis提供了一个连接池实现,即JedisPool,它允许开发者预先创建一定数量的Redis连接,当需要使用时从池中获取,用完后归还,而不是直接关闭。 JedisPool的使用步骤大致如下: 1. 引入依赖:在项目中,...

    jedispool连redis高并发卡死的问题

    jedispool是基于apache common pool实现的连接池,它将连接Redis服务器的操作抽象成了一个池子,池子中可以容纳多个连接对象。客户端可以从池子中获取连接对象,执行操作后再返还给池子。jedispool提供了许多配置...

    common-pool2

    而`common-pool2`就是Apache Commons提供的一个通用对象池库,它是Jedis连接池的必备组件。 `common-pool2`是Apache Commons Pool的第二个主要版本,它提供了对对象池的实现,允许开发者高效地管理和重用对象,避免...

    SpringBoot2.2+commons-pool2实现多Ftp连接池完整项目,开箱即用,经过长期生产使用稳定可靠

    使用JDK1.8、SpringBoot2.2.10.RELEASE、lombok1.18.8、guava23.0、hutool5.3.10、commons-pool2 2.7.0、tika1.22等实现多Ftp连接池实现,通过守护线程实现连接池内连接可用性校验,配置最大、最小连接个数防止Ftp...

    通过Apache common pool开源包实现对象池

    下面通过一个简单的样例来说明如何利用apache common pool来应用对象池。...也许本样例并不是很恰当,但是如何StringFormat换成是数据库连接就非常适合池技术了,此样例仅用于说明如何使用apache common pool池而已。

    Apache commons-pool2-2.4.2源码学习笔记

    这在需要按特定键分配对象的场景下非常有用,如数据库连接池。`KeyedObjectPool-uml.jpg`可能是一个UML图,展示了`KeyedObjectPool`的相关类和接口关系。 `PooledObjectFactory`接口扮演了对象工厂的角色,负责创建...

    commons-dbcp-1.4&&commons-pool-1.3.jar

    Apache Commons DBCP(Database Connection Pool)是Apache开源组织提供的一个数据库连接池实现。它允许开发者在应用中高效地管理和重用数据库连接,从而提高系统性能并降低资源消耗。DBCP 1.4是这个库的一个稳定...

    common-dbcp.jar,common-pool.jar,common-collections.jar

    commons-dbcp-1.4 jar java连接池. .commons-dbcp 是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要3个包:

    apache common pool2 实例

    这个例子展示了如何利用Apache Commons Pool2创建一个OSS连接池,并将其与Spring框架集成。通过Spring的依赖注入,我们可以方便地在应用中使用这些配置好的连接池。在实际项目中,可以根据需求调整`...

    Socket-Apache-Commons-Pool2

    套接字-Apache-公共-Pool2 这是一个有关如何使用套接字服务器和客户端的演示。 套接字客户端使用Apache公共pool2来管理套接字。 因此,我们可以在多线程的情况下使用共享套接字。 我使用bernardvai的示例创建了套接...

    commons-dbcp-1.4.jar和commons-pool-1.4.jar

    Apache Commons DBCP (Database Connection Pool) 和 Commons Pool 是两个重要的Java库,它们在处理数据库连接池方面发挥着核心作用。这两个JAR文件——commons-dbcp-1.4.jar和commons-pool-1.4.jar,是Apache软件...

Global site tag (gtag.js) - Google Analytics