上一篇我们讲到了C3P0PooledConnectionPool
,并且最后说到C3P0PooledConnectionPool
中的很多关于连接的操作都委托给了BasicResourcePool
来处理,那么下面就隆重请出今天的主角——BasicResourcePool
及其帮手——BasicResourcePoolManager
。不过写了半天觉得BasicResourcePoolManager
的结构和源码太过于复杂,写起博客来压力太大,所以这一篇先来介绍BasicResourcePool
中的核心任务。注意,这里只会对这些任务的功能做一个介绍,并介绍会影响任务的各种参数:
核心成员变量
下面这些成员变量先有个了解就好,后续也许会用到
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;
HashSet acquireWaiters = new HashSet();
ScatteredAcquireTask
从数据库获取连接任务,该任务替代了之前的AcquireTask
相关连接池参数:
-
acquireRetryAttempts
对应num_acq_attempts
,代表获取连接失败后重试的次数
-
acquireRetryDelay
对应acq_attempt_delay
,代表连接失败后,开启新任务的延迟
光有上述两个参数你可能不太理解C3P0对于重试的具体做法:当获取连接任务失败时,若重试次数大于0,那么会在 延迟一段时间之后 开启重试线程再次去获取连接,并且该新线程的重试次数会递减1。注意:上述失败均指的是抛出异常
那么何时需要去数据库获取新连接呢?肯定是连接不够用了嘛。比如此时用户请求上来,独占了一条线程,跑到需要执行SQL的地方,发现连接池中的连接不够用了,那么它会触发连接池扩容(异步),并且自身会等待到池中获取到第一个连接,这里又会涉及到几个连接池的参数:
-
checkoutTimeout
对应checkoutTimeout
,代表等待获取连接超时时间,也就是 用户请求最长等待可用连接的时间
-
acquireIncrement
对应inc
,代表每次需要扩容时的扩容量
RemoveTask
这个任务和上一个任务相反,用来移除和销毁连接
CullTask
用来销毁过期的连接,该任务为定时任务
任务执行周期:
这里分两种情况:
- 一种可以显式指定运行周期,也就是通过配置下面的参数:
propertyCycle
对应expiration_enforcement_delay
-
如果不显示指定运行周期,那么会通过以下参数计算出一个周期:
-
maxConnectionAge
对应max_resource_age
,代表连接时长
-
maxIdleTime
对应max_idle_time
,代表最大过期时长
-
maxIdleTimeExcessConnections
对应excess_max_idle_time
,代表
-
unreturnedConnectionTimeout
对应destroy_unreturned_resc_time
,代表最大允许连接被checkout的时长
从这4个参数中取出最小的一个,当然小于等于0时不作考虑。然后会以最小值来除以4作为该任务的运行周期
初次执行任务延迟:
也分两种情况:
- 显式指定时,即为
propertyCycle
- 不显式指定,那么即从这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连接池是Java开发中常用的数据库连接池组件,它能够有效地管理和优化数据库连接,提高应用程序的性能和效率。C3P0由Mithun Das Laskar创建,是一个开源项目,广泛应用于各种Java Web应用中。下面将详细介绍C3P0...
C3P0是一个开源的Java数据库连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。在Java应用程序中,数据库连接池扮演着非常重要的角色,它能够有效地管理数据库连接,提高系统性能,减少数据库资源...
C3P0数据库连接池是Java开发中广泛使用的开源组件,用于管理数据库连接,提高数据库访问效率并降低系统资源消耗。源代码分析可以帮助我们深入理解其内部机制,从而更好地优化和配置C3P0,提升应用程序性能。 1. **...
c3p0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。c3p0的主要功能是管理数据库连接,提高数据库访问效率,避免因为频繁创建和销毁数据库连接而造成大量的系统资源浪费。在高...
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。在Java应用中,尤其是在Web应用中,频繁的数据库连接创建和关闭会消耗大量的系统资源,而通过使用C3P0这样的连接池,可以...
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。C3P0的主要特点是轻量级、高效且稳定,广泛应用于各种Java Web应用中。在本文中,我们将深入探讨C3P0连接池的配置,以便更...
总的来说,c3p0作为一款成熟的数据库连接池,能够有效提升应用程序的数据库访问性能,结合DBUtils可以进一步简化开发过程。在实际使用中,我们需要根据项目需求合理配置,并注意资源管理,以实现高效、稳定的数据...
2. **配置c3p0**:创建一个配置文件(如c3p0.properties或在应用的配置文件中添加c3p0相关配置),设定连接池的基本属性,如数据库驱动、用户名、密码、初始化连接数等。 3. **创建数据源**:在Java代码中,通过`...
C3P0连接池是Java开发中常用的数据库连接池组件,它可以帮助应用程序高效、稳定地管理数据库连接。C3P0是由Maurice Priess创建的一个开源项目,它旨在提供一个健壮、完全免费的JDBC连接池实现,以解决数据库连接管理...
C3P0是一个开源的Java数据库连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。这个连接池在许多应用中被广泛使用,因为它提供了良好的性能和稳定性。在深入理解C3P0源码之前,我们需要先了解一下...
C3P0数据库连接池技术是一种广泛应用于Java后端开发中的开源组件,它提供了一种高效、灵活的方式来管理数据库连接,以优化应用程序的性能。C3P0版本号0.9.5.2是该库的一个稳定版本,包含了对多种数据库(如MySQL, ...
C3P0连接池是一个开源的Java数据库连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。在Java应用程序中,数据库连接的创建和销毁是耗时操作,而连接池则可以有效地管理这些连接,避免频繁地创建和...
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。这个压缩包包含了使用C3P0连接池所需的全部组件,包括mchange-commons-java库和C3P0的核心库。以下是关于C3P0连接池及其...
c3p0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。使用c3p0连接池可以有效地管理和优化数据库连接,提高系统的性能和稳定性。下面将详细介绍c3p0的配置和使用方法。 ### 1....
3. 初始化c3p0连接池:在Java代码中,通过`ComboPooledDataSource`类实例化一个连接池,并加载配置。 4. 获取和释放连接:在需要操作数据库的地方,通过连接池的`getConnection()`方法获取连接,使用完毕后调用`...
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。在Java应用程序中,尤其是在Web应用中,使用数据库连接池可以有效地管理和控制数据库连接,提高系统的性能和效率。下面...
C3P0连接池是一个广泛使用的Java数据库连接池实现,它允许程序在多个数据库操作之间重用数据库连接,从而提高应用程序的性能和效率。数据库连接池管理着数据库连接的创建、分配、回收和销毁,避免了频繁的创建和关闭...
**c3p0数据库连接池**是Java后端开发中常用的一个开源的数据库连接池组件,主要用于管理和优化数据库连接。它的全称是ComMchange V3 Pooled Database Connections,由Maurice Priess创建,旨在提供一个高效、灵活且...