`
Jony.Hwong
  • 浏览: 116710 次
  • 来自: ...
社区版块
存档分类
最新评论

数据库连接池-C3P0配置

阅读更多
>>转自:http://hi.baidu.com/fangpw/blog/item/539e11123e36d45cf919b841.html

最近常有数据库和网络设备升级和搬迁等事情,而各个应用都是基于数据库连接池做的,大部分都是基于C3P0,数据库或网络状况的变动都会导致客户端连接池中的connection失效,如何剔除这些blocked connection就和C3P0的各个配置息息相关。这两天,搭了个实验环境,根据C3P0的配置说明和实验结果,把C3P0关于这块的机制解析了一番。先看看我的结论:

1)C3P0容错和自动重连与以下配置参数有关:

•breakAfterAcquireFailure :true表示pool向数据库请求连接失败后标记整个pool为block并close,就算后端数据库恢复正常也不进行重连,客户端对pool的请求都拒绝掉。false表示不会标记 pool为block,新的请求都会尝试去数据库请求connection。默认为false。因此,如果想让数据库和网络故障恢复之后,pool能继续请求正常资源必须把此项配置设为false
•idleConnectionTestPeriod :C3P0会有一个Task检测pool内的连接是否正常,此参数就是Task运行的频率。默认值为0,表示不进行检测。
•testConnectionOnCheckout :true表示在每次从pool内checkout连接的时候测试其有效性,这是个同步操作,因此应用端的每次数据库调用,都会先通过测试sql测试其有效性,如果连接无效,会关闭此连接并剔除出pool,并尝试从pool内取其他连接,默认为false,此特性要慎用,会造成至少多一倍的数据库调用。
•testConnectionOnCheckin :true表示每次把连接checkin到pool里的时候测试其有效性,因为是个事后操作,所以是异步的,应用端不需要等待测试结果,但同样会造成至少多一倍的数据库调用。
•acquireRetryAttempts 和acquireRetryDelay :pool请求取连接失败后重试的次数和重试的频率。请求连接会发生在pool内连接少于min值或则等待请求数>池内能提供的连接数
•automaticTestTable 、connectionTesterClassName 、preferredTestQuery :表示测试方式,默认是采用 DatabaseMetaData.getTables()来测试connection的有效性,但可以通过以上配置来定制化测试语句,通过其名字就很好理解其含义,无需过多解释

•maxIdleTime 和 maxConnectionAge :表示connection的时效性,maxIdleTime和maxConnectionAge不同之处在于, maxIdleTime表示idle状态的connection能存活的最大时间,而 maxConnectionAge表示 connection能存活的绝对时间
2)应用端getConnection抛出exception时, C3P0会测试其connection的有效性,并根据状态处理此connection,但应用端不会重调。

3)无论是网络问题还是远端数据库服务器,就算恢复正常后,客户端pool内其已存在的connection都会失效,要保证应用端调用无误,必须在checkout到应用端之前刷新这些无效connection

4)breakAfterAcquireFailure=false是关键。如果 breakAfterAcquireFailure=true ,一旦pool向数据库请求连接失败,就会标记pool block并关闭pool,这样无论数据库是否恢复正常,应用端都无法从pool拿到连接

5)要想保证网络和数据库瞬间的失效100%不会造成应用端getConnection失败必须开启 testConnectionOnCheckout。但此特性的代价巨大,建议在应用端做容错。

6)推荐使用 idleConnectionTestPeriod。可以根据应用调用频率权衡一个检查pool的频率,这样可以在保证性能损耗不大情况下,尽可能的保证pool内connection的有效性


7)若嫌DatabaseMetaData.getTables()性能不好,可以尝试通过配置automaticTestTable、 connectionTesterClassName、preferredTestQuery来找到一个性能最好的测试语句,只要能验证 connection有效就行

综上所述,要想保证性能的前提下,本人推荐的配置组合如下:

breakAfterAcquireFailure: false
testConnectionOnCheckout: false
testConnectionOnCheckin: false
idleConnectionTestPeriod: 60
acquireRetryAttempts: 10
acquireRetryDelay: 1000

但需要注意的是以上的配置不能保证100%应用端getConnection无误,如果应用端不能发生getConnection错误,需要自行考虑容错和重试机制。

在以上配置下,当网络或数据库发生瞬间变动的情况下,会有如下事情发生:

1)自动测试idleConnection的 task轮训检测pool,对每个connction通过DatabaseMetaData.getTables()来测试有效性,并剔除无效连接。

2)根据请求情况和配置,pool向数据库请求新连接并加入池内

3)应用端getConnection->是否发生异常->如果发生异常,检验其有效性,并剔除出pool->如果没有发生异常(自动检查task之前已检测),调用成功
分享到:
评论

相关推荐

    数据库连接池c3p0jar包

    总的来说,C3P0作为一款成熟的数据库连接池,对于Java开发者来说,是一个值得信赖的工具,可以帮助我们更有效地管理和使用数据库连接,提升应用程序的性能和可靠性。在实际项目中,根据具体需求合理配置C3P0,可以更...

    开源数据库连接池c3p0

    开源数据库连接池c3p0是一款广泛应用于Java后端开发中的数据库连接管理工具,它能够有效地管理和优化数据库连接,提高应用的性能和响应速度。c3p0的主要功能包括连接池的创建、维护以及自动回收资源,使得多个并发...

    数据库连接池C3P0.zip

    在本压缩包“数据库连接池C3P0.zip”中,包含了C3P0数据库连接池的相关jar包以及配置文件,用于帮助开发者集成到他们的Java应用中,特别是与MYSQL数据库配合使用。 C3P0的主要特性包括: 1. **连接池管理**:C3P0...

    C3P0连接池配置需要的jar包

    C3P0连接池是Java应用中常用的数据库连接池组件,它允许程序在不关闭物理连接的情况下,管理和重用数据库连接,从而提高了应用程序的性能和效率。C3P0库依赖于其他几个JAR包来实现其功能,包括`c3p0-0.9.2.1.jar`、`...

    c3p0数据库连接池

    **c3p0数据库连接池详解** c3p0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。c3p0的主要功能是管理数据库连接,通过复用已存在的连接来提高数据库访问效率,减少系统资源...

    数据库连接池c3p0所需jar包

    本文将深入探讨数据库连接池的概念,重点介绍C3P0连接池及其所需的JAR包。 首先,数据库连接池是一种在应用服务器启动时预创建并维护一定数量的数据库连接的机制。这些连接可以被多个并发请求共享,而不是每个请求...

    数据库连接池-jar包

    数据库连接池是现代应用程序开发中的重要组成部分,尤其是在处理大量并发请求时。它是一种管理数据库连接的机制,通过复用已存在的数据库连接,避免了频繁创建和销毁连接带来的性能开销和资源浪费。jar包(Java ...

    java中c3p0数据库连接池使用方法(c3p0-config.xml+c3p0-0.9.2-pre1.jar+JdbcPool_c3p0.java)

    java中c3p0数据库连接池使用方法(c3p0-config.xml+c3p0-0.9.2-pre1.jar+JdbcPool_c3p0.java),里面包含了c3p0-0.9.2-pre1.jar、以及配置文件:c3p0-config.xml、以及一个c3p0数据库连接池工具类(只有简单的两个方法...

    c3p0数据库连接池案例

    总的来说,c3p0数据库连接池案例提供了一个完整的示例,涵盖了从配置到使用的全过程,有助于加深对数据库连接池概念的理解,并提升你在Java项目中的数据库管理能力。通过实践这个案例,你可以掌握如何更高效、更稳定...

    数据库连接池dbcp和c3p0jar包

    "数据库连接池dbcp和c3p0jar包"这个压缩包包含了这两个库的JAR文件,开发者可以解压并导入到自己的项目中,然后通过简单的代码配置来启用数据库连接池服务。例如,使用Spring框架,可以在配置文件中声明数据源,指定...

    java数据库连接池c3p0

    Java数据库连接池C3P0是一种常用的开源数据库连接管理工具,它通过提供连接池服务,提高了应用程序处理数据库连接的效率,降低了系统资源的消耗。在Java应用中,尤其是在服务器端,数据库连接的创建和关闭是相对耗时...

    数据库连接池C3P0,Druid数据库连接池jar包.zip

    本压缩包包含了两种常用的数据库连接池实现:C3P0和Druid,它们都是为了优化数据库连接创建与管理而设计的。 1. C3P0连接池: C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准...

    c3p0连接池使用所需jar包

    在Java应用程序中,尤其是在Web应用中,使用数据库连接池可以有效地管理和控制数据库连接,提高系统的性能和效率。下面我们将详细探讨C3P0连接池的使用以及所需的jar包。 首先,C3P0连接池的主要功能包括: 1. **...

    C3P0数据库连接池jar包(完整版)

    C3P0数据库连接池是Java开发中常用的一个开源组件,它主要用于管理数据库连接,以提高应用程序处理数据库的效率和性能。C3P0是由Mithral Software公司开发的,其全称为Comerica Commercial Connection Pool,是一款...

    数据库连接池C3P0,jar包

    总的来说,C3P0是一个强大且可靠的数据库连接池实现,它提供了许多高级特性和配置选项,使得开发者能够根据项目需求优化数据库连接的管理。正确地使用C3P0不仅可以提高系统的响应速度,还能有效地减少资源浪费,提升...

    c3p0数据库连接池示例

    c3p0作为一款轻量级的数据库连接池,其易于配置和使用的特点使其在小型项目中广泛应用。通过合理配置,可以有效地管理数据库连接,提高系统的响应速度和稳定性。在实际项目中,根据系统的负载情况,不断调整和优化...

    c3p0数据库连接池架包及源码

    在实际开发中,可以结合Spring框架使用C3P0,通过XML配置或注解方式将C3P0集成到Spring的事务管理中,简化数据库连接池的管理和使用。 总之,C3P0是一个强大的数据库连接池组件,提供了一整套完善的管理机制和性能...

    c3p0数据库连接池所需jar包

    总结,C3P0作为一款历史悠久的数据库连接池,虽然在一些新特性上可能不及其他现代连接池,但其丰富的配置选项和良好的性能表现仍然使其在某些场景下具有竞争力。正确配置和使用C3P0,可以显著提升Java应用程序的...

Global site tag (gtag.js) - Google Analytics