- 浏览: 616176 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
xianzi_2008:
xianzi_2008 写道楼主请教下,我缓存了一个List& ...
Ehcache -
xianzi_2008:
楼主请教下,我缓存了一个List<Bean>对象, ...
Ehcache -
jsdsh:
收藏好.五个字
hibernate之one-to-many详细 -
Tlife:
好!!!!
hibernate------HQL总结 -
yanqingluo:
例子很恰当。
观察者模式
使用c3p0,偶尔会报异常:
出现这种异常的原因是:
Mysql服务器默认的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该connection。这就是问题的所在,在C3P0 pools中的connections如果空闲超过8小时,Mysql将其断开,而C3P0并不知道该connection已经失效,如果这时有Client请求connection,C3P0将该失效的Connection提供给Client,将会造成上面的异常。
解决办法:
注意参数:
//如果设为true那么在取得连接的同时将校验连接的有效性。Default: false
testConnectionOnCheckin = true
//自动测试的table名称,c3p0将建一张名为C3P0TestTable的空表,并使用其自带的查询语句进行测试。如果定义了这个参数那么
//属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作,它将只供c3p0测试使用。Default: null
automaticTestTable=C3P0TestTable
//每1800秒检查所有连接池中的空闲连接。Default: 0
idleConnectionTestPeriod = 1800
//最大空闲时间,3600秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0
maxIdleTime = 3600
/**因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的
时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable
等方法来提升连接测试的性能。Default: false */
testConnectionOnCheckout = true
另外:需要在JDBC URL上面加一个autoReconnect=true 参数
还有一个需要注意:mysql服务的wait_timeout和interactive_timeout的值要大于c3p0的maxIdleTime参数值
2008-02-18 10:52:53 ERROR Thread-4 com.feedsky.dao.AbstractMutiDbDAO - com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: ** BEGIN NESTED EXCEPTION ** java.io.EOFException STACKTRACE: java.io.EOFException at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1913) at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2304) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2803) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1573) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1665) at com.mysql.jdbc.Connection.execSQL(Connection.java:3170) at com.mysql.jdbc.Connection.execSQL(Connection.java:3099) at com.mysql.jdbc.Statement.executeQuery(Statement.java:1169) at com.mchange.v2.c3p0.impl.NewProxyStatement.executeQuery(NewProxyStatement.java:35) at com.feedsky.dao.AbstractMutiDbDAO.findBySQL(AbstractMutiDbDAO.java:34) at com.feedsky.dao.impl.SrcItemDAOImpl.findBySQL(SrcItemDAOImpl.java:326) at com.feedsky.dao.impl.SrcItemDAOImpl.loadByItemUuid(SrcItemDAOImpl.java:255) at com.feedsky.service.impl.SrcItemServiceImpl.loadByItemUuid(SrcItemServiceImpl.java:37) at com.feedsky.controller.SrcFeedController.saveSrcFeed(SrcFeedController.java:97) at com.feedsky.work.SrcStoreThread.saveSrcFeed(SrcStoreThread.java:174) at com.feedsky.work.SrcStoreThread.run(SrcStoreThread.java:53) at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:748) at java.lang.Thread.run(Thread.java:619) ** END NESTED EXCEPTION ** Last packet sent to the server was 176 ms ago. 2008-02-18 10:52:53 ERROR Thread-4 com.feedsky.work.SrcStoreThread - java.lang.NullPointerException 2008-02-18 10:52:53 INFO Thread-2 com.feedsky.dao.impl.SrcItemDAOImpl - com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: ** BEGIN NESTED EXCEPTION ** java.io.EOFException STACKTRACE: java.io.EOFException at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1913) at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2304) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2803) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1573) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1665) at com.mysql.jdbc.Connection.execSQL(Connection.java:3170) at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1316) at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1235) at com.mchange.v2.c3p0.impl.NewProxyStatement.executeUpdate(NewProxyStatement.java:64) at com.feedsky.dao.impl.SrcItemDAOImpl.insert(SrcItemDAOImpl.java:178) at com.feedsky.service.impl.SrcItemServiceImpl.save(SrcItemServiceImpl.java:29) at com.feedsky.controller.SrcFeedController.saveSrcFeed(SrcFeedController.java:111) at com.feedsky.work.SrcStoreThread.saveSrcFeed(SrcStoreThread.java:174) at com.feedsky.work.SrcStoreThread.run(SrcStoreThread.java:53) at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:748) at java.lang.Thread.run(Thread.java:619) ** END NESTED EXCEPTION **
出现这种异常的原因是:
Mysql服务器默认的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该connection。这就是问题的所在,在C3P0 pools中的connections如果空闲超过8小时,Mysql将其断开,而C3P0并不知道该connection已经失效,如果这时有Client请求connection,C3P0将该失效的Connection提供给Client,将会造成上面的异常。
解决办法:
public synchronized static DataSource createDataSource(String driver,String url,String username,String password) throws SQLException, ClassNotFoundException { Class.forName(driver); DataSource ds_unpooled = DataSources.unpooledDataSource(url,username,password); Map overrides = new HashMap(); //当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 overrides.put("acquireIncrement", 5); overrides.put("minPoolSize", 5); overrides.put("maxPoolSize", 10); //overrides.put("initialPoolSize",cfg.getMaxPoolSize()); overrides.put("maxStatements", 10000); //最大空闲时间,3600秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 overrides.put("maxIdleTime", 3600 ); overrides.put("automaticTestTable", "C3P0TestTable"); overrides.put("testConnectionOnCheckin", true); // 每60秒检查所有连接池中的空闲连接。Default: 0 overrides.put("idleConnectionTestPeriod",18000); overrides.put("testConnectionOnCheckout", true); //获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效 //保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试 //获取连接失败后该数据源将申明已断开并永久关闭。Default: false overrides.put("breakAfterAcquireFailure", true); //c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能 //通过多线程实现多个操作同时被执行。Default: 3 overrides.put("numHelperThreads", 10); // create the PooledDataSource using the default configuration and our overrides DataSource ds_pooled = DataSources.pooledDataSource( ds_unpooled, overrides ); return ds_pooled; }
注意参数:
//如果设为true那么在取得连接的同时将校验连接的有效性。Default: false
testConnectionOnCheckin = true
//自动测试的table名称,c3p0将建一张名为C3P0TestTable的空表,并使用其自带的查询语句进行测试。如果定义了这个参数那么
//属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作,它将只供c3p0测试使用。Default: null
automaticTestTable=C3P0TestTable
//每1800秒检查所有连接池中的空闲连接。Default: 0
idleConnectionTestPeriod = 1800
//最大空闲时间,3600秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0
maxIdleTime = 3600
/**因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的
时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable
等方法来提升连接测试的性能。Default: false */
testConnectionOnCheckout = true
另外:需要在JDBC URL上面加一个autoReconnect=true 参数
还有一个需要注意:mysql服务的wait_timeout和interactive_timeout的值要大于c3p0的maxIdleTime参数值
发表评论
-
常用小代码段和开发经验收集
2011-04-21 14:47 942工作中用到的笔记,方便查找,不断补充。 1,截取过长的文字部分 ... -
java.lang.UnsupportedClassVersionError: Bad version number in .class file
2009-08-26 12:25 3865转载:http://www.blogjava.net/hwpo ... -
java调用dll(Eclipse+CDT+MinGW)
2009-03-06 15:25 6514第一步:配置环境 需要安装CDT和MinGW. CDT:因为 ... -
servlet2.5与el表达式
2008-11-23 15:23 2632Servlet2.4版本默认支持EL,如果在MyEclipse ... -
自定义ClassLoader遇到的问题
2008-09-16 16:47 14861.自定义的类加载器 package classloa ... -
自定义标签调用资源文件
2008-05-12 22:28 1921自定义标签处理类一般都继承TagSupport或BodyTag ... -
Failed to install Tomcat6 service(Tomcat6安装失败解决方法)
2008-05-06 16:24 11655转载 :http://www.handandaily.com/ ... -
tomcat5.5日志配置
2008-05-06 16:13 2484tomcat5.5日志配置: 从Tomcat5.5后,默认设置 ... -
java List<String>集合 传递值给js的数组
2008-04-21 18:12 5287<script> var intIndex= ... -
Pattern Matcher
2008-02-18 10:30 1905package test; import java. ... -
FileUpload组件上传文件
2008-01-23 03:05 6673利用FileUpload组件上传文件,需要到apache上下载 ... -
hibernate大字段处理
2008-01-21 16:45 3176hibernate大字段处理:以mysql为例 比如传张图片, ... -
一个页面嵌套一个页面
2008-01-15 10:45 3509一个页面嵌套一个页面,比如a.jsp嵌套b.jsp那么可以用 ... -
java clone
2008-01-13 18:17 59051.java里的clone分为: A:浅复制(浅克隆): 浅复 ... -
修改Eclipse注释里的${Date}变量格式
2008-01-08 15:47 81731.eclipse3.3里${date}日期格 ... -
List移除元素
2008-01-05 16:16 24391. Iterator的remove()是移除从集合里取出来的 ... -
JDom处理xml
2008-01-05 13:51 20691.DOM的缺点主要是由于DOM是一个接口定义语言(IDL), ... -
观察者模式
2008-01-03 00:45 21310观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听 ... -
DelegatingRequestProcessor
2007-12-27 11:30 3661采用DelegatingRequestProcessor将处理 ... -
Dom and Sax
2007-12-26 20:20 1167jaxp: java apis for xml parsing ...
相关推荐
Cause com.mysql.jdbc.exceptions.jdbc4.CommunicationsException The last packet successfully received from the server was 47,795,922 milliseconds ago. The last packet sent successfully to the server was...
com.mysql.jdbc.CommunicationsException Communications link failure due to underlying exception:
1、写在开头 标题之前我想说一下Linux的mysql真的实在是太坑了。太坑了。总是会出现这样那样的你想不到的问题。崩溃了。首先来罗列一下我遇到过的...Cause:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorExcepti
1、Caused by: com.MySQL.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 56,201,339 milliseconds ago. The last packet sent successfully to the...
如果单独写一个类,并编译执行访问数据库,正常,但是用web应用来调这个类连接数据库,就会出现错误:com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: ...