为什么80%的码农都做不了架构师?>>>   

最近常有数据库和网络设备升级和搬迁等事情,而各个应用都是基于数据库连接池做的,大部分都是基于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之前已检测),调用成功

转载于:https://my.oschina.net/jsan/blog/34968

关于C3P0容错和自动重连特性的研究相关推荐

  1. 解读dbcp自动重连那些事---转载

    http://agapple.iteye.com/blog/791943 可以后另一篇做对比:http://agapple.iteye.com/blog/772507 同样的内容,不同的描述方式,不一 ...

  2. 关于因和数据库库断开数据源没有自动重连变无效的问题

    转自 http://agapple.iteye.com/blog/791943 可以后另一篇做对比:http://agapple.iteye.com/blog/772507 同样的内容,不同的描述方式 ...

  3. C3P0,Proxool,BoneCP,Druid等连接池的断开自动重联功能

    数据库连接池的断开自动重联.失败恢复功能显得很重要,不知道目前主流的数据库连接池:C3P0,Proxool,BoneCP,Druid等支持如何? 我知道的: Proxool: ? 1 2 3 4 5 ...

  4. oracle 10g在线重定义新特性——关联对象自动重命名(二)

    9i的在线重定义存在一个问题,执行完在线重定义后,表的名称虽然保持不变,但是索引.约束.触发器等关联对象的名称会发生变化,有时候这会带来一定的问题,而要在事后手工修改,会比较麻烦. 10g的在线重定义 ...

  5. jdbc mysql 自动重连_Mysql中JDBC如何完成自动重连机制的案例

    软件安装:装机软件必备包 SQL是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言.在使用它时,只需要发出& ...

  6. jdbc mysql 自动重连_JDBC实现Mysql自动重连机制的方法详解

    JDBC是Java程序连接和访问各种数据库的API,它可以提供Java程序和各种数据库之间的连接服务,下面是爱站技术频道小编为大家带来的JDBC实现Mysql自动重连机制的方法详解. 日志:using ...

  7. c语言mysql自动重连接_c++操作mysql数据库

    就拿查询MySQL获取结果集并在页面上显示数据为例来分析. HTTP请求由C级别的程序比如Apache/Nginx处理(Java的HTTP服务用的是Java开发的Tomcat等), PHP则调用内置在 ...

  8. 51单片机 自动重装载值计算

    单片机在不同的方式下,有不同的最大值.咱们现在针对单片机的方式1,设最大值为M.那么M的值应该是: M=2^16 = 65535 因为定时器是在一直加1计数的,并且在达到并且超过M的值的时候产生一个中 ...

  9. STM32 usb 设备实现自动重枚举

    在开发USB设备时可能会经常遇到烧录程序后要重新拔插USB接口才能使USB设备正常工作,原因是因为重新烧录后,PC没有对USB设备进行重枚举,导致无法正常工作,解决方法很简单,我们只要在程序启动后第一 ...

最新文章

  1. C~K招亲_JAVA
  2. 关于citrix 负载及WI的一些问题
  3. c语言计算时间的编程,C语言实现时间戳转日期的算法(推荐)
  4. 转:26个Jquery使用小技巧(jQuery tips, tricks solutions)
  5. HDU4035 Maze(树上期望)
  6. Node.js 应用故障排查手册 —— 正确打开 Chrome devtools
  7. js地址栏获取参数的方法,解决中文乱码问题,能支持中文参数
  8. TikZ绘图示例——尺规作图:直角的画法(一)
  9. 酒诗词之一(七言诗)
  10. 关于网络安全域隔离问题 你真的了解吗?
  11. raster包—crop函数
  12. 备份华为物理服务器目录到U盘
  13. 华为智慧屏和荣耀智慧屏究竟有什么区别?
  14. 微信小程序开发入门(二)image标签及图片样式
  15. 微软发布免费的文件恢复工具
  16. ARM Cortex-M 系列 MCU 芯片选型
  17. 如何设置和取消RAR文件的密码保护
  18. ireport 5.6.0的常见使用及开发报表中经常遇到的问题总结
  19. 关于Xylon这个名字
  20. C语言源代码系列-管理系统之学生籍贯信息

热门文章

  1. 提高关键词排名的28个SEO技巧
  2. 终于找到你!如何将前端console.log的日志保存成文件?
  3. 一天掌握Android JNI本地编程 快速入门
  4. ObjectAnimator属性动画应用demo
  5. css改变谷歌浏览器的滚动条样式
  6. Flask 应用的文件结构
  7. 双击打开Inventor文件
  8. iis 404错误从定向完美方案
  9. oracle for函数,oracle分区表述的FOR语句(一)
  10. mysql内连接的自连接_mysql 内连接、外连接、自连接