DBCP Mysql报错!Communications link failure due to underlying exception
来源:互联网 发布:淘宝怎么问卖家问题 编辑:程序博客网 时间:2024/06/06 19:54
最近的一个项目在Hibernate使用C3P0的连接池,数据库为Mysql。开发测试没有问题,在运行中每个一段长的空闲时间就出现异常:
java 代码
- org.hibernate.exception.JDBCConnectionException: could not execute query
- at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:74)
- at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
- .......
- Caused by: com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: No operations allowed after connection closed.Connection was implicitly closed due to underlying exception/error:
- ** BEGIN NESTED EXCEPTION **
- com.mysql.jdbc.CommunicationsException
- MESSAGE: Communications link failure due to underlying exception:
- ** BEGIN NESTED EXCEPTION **
- java.net.SocketException
- MESSAGE: Broken pipe
- STACKTRACE:
- java.net.SocketException: Broken pipe
- at java.net.SocketOutputStream.socketWrite0(Native Method)
- ......
- ** END NESTED EXCEPTION **
查看了Mysql的文档,以及Connector/J的文档以及在线说明发现,出现这种异常的原因是:
Mysql服务器默认的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该connection。这就是问题的所在,在C3P0 pools中的connections如果空闲超过8小时,Mysql将其断开,而C3P0并不知道该connection已经失效,如果这时有Client请求connection,C3P0将该失效的Connection提供给Client,将会造成上面的异常。
解决的方法有3种:
- 增加wait_timeout的时间。
- 减少Connection pools中connection的lifetime。
- 测试Connection pools中connection的有效性。
当然最好的办法是同时综合使用上述3种方法,下面就DBCP和C3P0分别做一说明,假设wait_timeout为默认的8小时
DBCP增加以下配置信息:
- //set to 'SELECT 1'
- validationQuery = "SELECT 1"
- //set to 'true'
- testWhileIdle = "true"
- //some positive integer
- timeBetweenEvictionRunsMillis = 3600000
- //set to something smaller than 'wait_timeout'
- minEvictableIdleTimeMillis = 18000000
- //if you don't mind a hit for every getConnection(), set to "true"
- testOnBorrow = "true"
C3P0增加以下配置信息:
- //获取connnection时测试是否有效
- testConnectionOnCheckin = true
- //自动测试的table名称
- automaticTestTable=C3P0TestTable
- //set to something much less than wait_timeout, prevents connections from going stale
- idleConnectionTestPeriod = 18000
- //set to something slightly less than wait_timeout, preventing 'stale' connections from being handed out
- maxIdleTime = 25000
- //if you can take the performance 'hit', set to "true"
- testConnectionOnCheckout = true
更多的配置信息大家可以查看C3P0文档,Connector/J文档,以及DBCP的文档。
0 0
- DBCP Mysql报错!Communications link failure due to underlying exception
- Mysql报错!Communications link failure due to underlying exception
- java工程连接远程MySQL数据库报错:Communications link failure due to underlying exception
- Communications link failure due to underlying exception
- Communications link failure due to underlying exception
- Communications link failure due to underlying exception:
- Communications link failure due to underlying exception: ** BEGIN NESTED EXCEPTION **
- Communications link failure due to underlying exception的原因
- Communications link failure due to underlying exception(转载)
- 数据库连接失败Communications link failure due to underlying exception!
- MyEclipse中报错:Communications link failure due to underlying exception
- 解决 Communications link failure due to underlying exception
- 解决“连接数据库是老是报Communications link failure due to underlying exception”
- com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:
- com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:
- 解决MySQL连接超时Communications link failure due to underlying exception
- 解决MySQL连接超时Communications link failure due to underlying exception
- 解决MySQL连接超时Communications link failure due to underlying exception
- 数字序列加入+,*运算符后取得最大值问题; 动态规划;打破传统从决策入手思想;找出问题的特有性质;从例子入手找特点
- CSAPP 学习笔记(1)
- PHP在方法中include另一个类
- 显示软件的权限信息
- 2014.3.6X$kmspp 谷歌
- DBCP Mysql报错!Communications link failure due to underlying exception
- 为什么我骂360弱智 周鸿祎却说“谢谢”
- 通过sap的表维护工具生成维护代码并建立自定义的TCODE
- Linux下lamp以及php开发环境相关配置
- 判断一颗树是否为二叉查找树
- 单链表的一些操作
- hdu 2082
- java 常用unicode编码汉字
- Dark Channel Prior去雾