`
45808916
  • 浏览: 5703 次
文章分类
社区版块
存档分类
最新评论

C3P0连接池初始化过程分析之二

 
阅读更多

上一篇我们讲到了C3P0PooledConnectionPool,并且最后说到C3P0PooledConnectionPool中的很多关于连接的操作都委托给了BasicResourcePool来处理,那么下面就隆重请出今天的主角——BasicResourcePool及其帮手——BasicResourcePoolManager。不过写了半天觉得BasicResourcePoolManager的结构和源码太过于复杂,写起博客来压力太大,所以这一篇先来介绍BasicResourcePool中的核心任务。注意,这里只会对这些任务的功能做一个介绍,并介绍会影响任务的各种参数:

核心成员变量

下面这些成员变量先有个了解就好,后续也许会用到

    /*  Key是池中的每个连接,Value是PunchCard类型 */ 
    HashMap  managed = new HashMap();

    /* 可用连接 */
    LinkedList unused = new LinkedList();

    /* 失效但是仍在使用的连接 */
    HashSet  excluded = new HashSet();

    /* 正在进行闲置检测的连接 */
    Set idleCheckResources = new HashSet();

    /* 正在使用却因某些原因失效的连接 */
    HashSet  excluded = new HashSet();

    /* 先前的连接 */
    Map formerResources = new WeakHashMap();

    /* 需要达到的连接池大小,会根据它和当前的连接池大小以及等待获取的队列大小计算出是扩容还是收缩 */
    int target_pool_size;

    /* 正在进行中的获取连接数 */
    int pending_acquires;
    /* 正在进行中的移除连接数 */    
    int pending_removes;

    /* 获取连接的Set */
    HashSet acquireWaiters = new HashSet();

ScatteredAcquireTask

从数据库获取连接任务,该任务替代了之前的AcquireTask

相关连接池参数:

  • acquireRetryAttempts对应num_acq_attempts,代表获取连接失败后重试的次数
  • acquireRetryDelay对应acq_attempt_delay,代表连接失败后,开启新任务的延迟

光有上述两个参数你可能不太理解C3P0对于重试的具体做法:当获取连接任务失败时,若重试次数大于0,那么会在 延迟一段时间之后 开启重试线程再次去获取连接,并且该新线程的重试次数会递减1。注意:上述失败均指的是抛出异常

那么何时需要去数据库获取新连接呢?肯定是连接不够用了嘛。比如此时用户请求上来,独占了一条线程,跑到需要执行SQL的地方,发现连接池中的连接不够用了,那么它会触发连接池扩容(异步),并且自身会等待到池中获取到第一个连接,这里又会涉及到几个连接池的参数:

  • checkoutTimeout对应checkoutTimeout,代表等待获取连接超时时间,也就是 用户请求最长等待可用连接的时间
  • acquireIncrement对应inc,代表每次需要扩容时的扩容量

RemoveTask

这个任务和上一个任务相反,用来移除和销毁连接


CullTask

用来销毁过期的连接,该任务为定时任务

任务执行周期:

这里分两种情况:

  1. 一种可以显式指定运行周期,也就是通过配置下面的参数: propertyCycle对应expiration_enforcement_delay
  2. 如果不显示指定运行周期,那么会通过以下参数计算出一个周期:

    • maxConnectionAge对应max_resource_age,代表连接时长
    • maxIdleTime对应max_idle_time,代表最大过期时长
    • maxIdleTimeExcessConnections对应excess_max_idle_time,代表
    • unreturnedConnectionTimeout对应destroy_unreturned_resc_time,代表最大允许连接被checkout的时长

从这4个参数中取出最小的一个,当然小于等于0时不作考虑。然后会以最小值来除以4作为该任务的运行周期

初次执行任务延迟:

也分两种情况:

  1. 显式指定时,即为propertyCycle
  2. 不显式指定,那么即从这4个参数中取出最小的一个,当然小于等于0时不作考虑。这个延迟不会除以4

相关连接池参数:

  • unreturnedConnectionTimeout对应destroy_unreturned_resc_time,代表最大允许连接被checkout的时长,超过这个时间后连接会被销毁。如果这个时间小于等于0,那么则没有限制。
  • propertyCycle对应expiration_enforcement_delay,代表显示指定的任务执行周期

CheckIdleResourcesTask

用来对闲置的连接进行有效性检测,该任务也为定时任务

任务执行周期:

通过参数idleConnectionTestPeriod对应check_idle_resources_delay手动指定,小于等于0时此任务不执行,也就是不进行闲置连接的有效性检测

初次执行任务延迟:

与任务的执行周期一致

相关连接池参数:

  • idleConnectionTestPeriod对应check_idle_resources_delay,代表任务执行的周期,小于等于0时此任务不执行,也就是不进行闲置连接的有效性检测

如何定义闲置连接:

不要紧张,这只是个文字游戏,此处的闲置连接也就是所有未使用的连接而已

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
分享到:
评论

相关推荐

    c3p0连接池jar包

    C3P0连接池是Java开发中常用的数据库连接池组件,它能够有效地管理和优化数据库连接,提高应用程序的性能和效率。C3P0由Mithun Das Laskar创建,是一个开源项目,广泛应用于各种Java Web应用中。下面将详细介绍C3P0...

    C3P0连接池jar包(正式).zip

    C3P0是一个开源的Java数据库连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。在Java应用程序中,数据库连接池扮演着非常重要的角色,它能够有效地管理数据库连接,提高系统性能,减少数据库资源...

    C3P0 连接池源码

    C3P0数据库连接池是Java开发中广泛使用的开源组件,用于管理数据库连接,提高数据库访问效率并降低系统资源消耗。源代码分析可以帮助我们深入理解其内部机制,从而更好地优化和配置C3P0,提升应用程序性能。 1. **...

    c3p0连接池工具

    c3p0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。c3p0的主要功能是管理数据库连接,提高数据库访问效率,避免因为频繁创建和销毁数据库连接而造成大量的系统资源浪费。在高...

    C3P0连接池管理类

    C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。在Java应用中,尤其是在Web应用中,频繁的数据库连接创建和关闭会消耗大量的系统资源,而通过使用C3P0这样的连接池,可以...

    C3P0连接池配置

    C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。C3P0的主要特点是轻量级、高效且稳定,广泛应用于各种Java Web应用中。在本文中,我们将深入探讨C3P0连接池的配置,以便更...

    c3p0连接池

    总的来说,c3p0作为一款成熟的数据库连接池,能够有效提升应用程序的数据库访问性能,结合DBUtils可以进一步简化开发过程。在实际使用中,我们需要根据项目需求合理配置,并注意资源管理,以实现高效、稳定的数据...

    c3p0连接池插件

    2. **配置c3p0**:创建一个配置文件(如c3p0.properties或在应用的配置文件中添加c3p0相关配置),设定连接池的基本属性,如数据库驱动、用户名、密码、初始化连接数等。 3. **创建数据源**:在Java代码中,通过`...

    c3p0连接池以及配置文件

    C3P0连接池是Java开发中常用的数据库连接池组件,它可以帮助应用程序高效、稳定地管理数据库连接。C3P0是由Maurice Priess创建的一个开源项目,它旨在提供一个健壮、完全免费的JDBC连接池实现,以解决数据库连接管理...

    c3p0连接池源码

    C3P0是一个开源的Java数据库连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。这个连接池在许多应用中被广泛使用,因为它提供了良好的性能和稳定性。在深入理解C3P0源码之前,我们需要先了解一下...

    C3P0连接池技术.zip

    C3P0数据库连接池技术是一种广泛应用于Java后端开发中的开源组件,它提供了一种高效、灵活的方式来管理数据库连接,以优化应用程序的性能。C3P0版本号0.9.5.2是该库的一个稳定版本,包含了对多种数据库(如MySQL, ...

    C3P0连接池jar包.rar

    C3P0连接池是一个开源的Java数据库连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。在Java应用程序中,数据库连接的创建和销毁是耗时操作,而连接池则可以有效地管理这些连接,避免频繁地创建和...

    C3P0连接池jar包(完整版).rar

    C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。这个压缩包包含了使用C3P0连接池所需的全部组件,包括mchange-commons-java库和C3P0的核心库。以下是关于C3P0连接池及其...

    c3p0连接池配置使用

    c3p0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。使用c3p0连接池可以有效地管理和优化数据库连接,提高系统的性能和稳定性。下面将详细介绍c3p0的配置和使用方法。 ### 1....

    c3p0数据库连接池案例

    3. 初始化c3p0连接池:在Java代码中,通过`ComboPooledDataSource`类实例化一个连接池,并加载配置。 4. 获取和释放连接:在需要操作数据库的地方,通过连接池的`getConnection()`方法获取连接,使用完毕后调用`...

    c3p0连接池使用所需jar包

    C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。在Java应用程序中,尤其是在Web应用中,使用数据库连接池可以有效地管理和控制数据库连接,提高系统的性能和效率。下面...

    C3P0连接池.zip

    C3P0连接池是一个广泛使用的Java数据库连接池实现,它允许程序在多个数据库操作之间重用数据库连接,从而提高应用程序的性能和效率。数据库连接池管理着数据库连接的创建、分配、回收和销毁,避免了频繁的创建和关闭...

    c3p0数据库连接池

    **c3p0数据库连接池**是Java后端开发中常用的一个开源的数据库连接池组件,主要用于管理和优化数据库连接。它的全称是ComMchange V3 Pooled Database Connections,由Maurice Priess创建,旨在提供一个高效、灵活且...

Global site tag (gtag.js) - Google Analytics