`
tcxiang
  • 浏览: 89546 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

c3p0 com.mysql.jdbc.CommunicationsException异常

    博客分类:
  • c3p0
 
阅读更多

使用c3p0,偶尔会报异常: 

Java代码  收藏代码
  1. 2008-02-18 10:52:53 ERROR Thread-4 com.feedsky.dao.AbstractMutiDbDAO - com.mysql.jdbc.CommunicationsException: Communications   
  2.   
  3. link failure due to underlying exception:   
  4.   
  5. ** BEGIN NESTED EXCEPTION **   
  6.   
  7. java.io.EOFException  
  8.   
  9. STACKTRACE:  
  10.   
  11. java.io.EOFException  
  12.         at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1913)  
  13.         at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2304)  
  14.         at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2803)  
  15.         at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1573)  
  16.         at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1665)  
  17.         at com.mysql.jdbc.Connection.execSQL(Connection.java:3170)  
  18.         at com.mysql.jdbc.Connection.execSQL(Connection.java:3099)  
  19.         at com.mysql.jdbc.Statement.executeQuery(Statement.java:1169)  
  20.         at com.mchange.v2.c3p0.impl.NewProxyStatement.executeQuery(NewProxyStatement.java:35)  
  21.         at com.feedsky.dao.AbstractMutiDbDAO.findBySQL(AbstractMutiDbDAO.java:34)  
  22.         at com.feedsky.dao.impl.SrcItemDAOImpl.findBySQL(SrcItemDAOImpl.java:326)  
  23.         at com.feedsky.dao.impl.SrcItemDAOImpl.loadByItemUuid(SrcItemDAOImpl.java:255)  
  24.         at com.feedsky.service.impl.SrcItemServiceImpl.loadByItemUuid(SrcItemServiceImpl.java:37)  
  25.         at com.feedsky.controller.SrcFeedController.saveSrcFeed(SrcFeedController.java:97)  
  26.         at com.feedsky.work.SrcStoreThread.saveSrcFeed(SrcStoreThread.java:174)  
  27.         at com.feedsky.work.SrcStoreThread.run(SrcStoreThread.java:53)  
  28.         at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:748)  
  29.         at java.lang.Thread.run(Thread.java:619)  
  30.   
  31.   
  32. ** END NESTED EXCEPTION **  
  33.   
  34.   
  35.   
  36. Last packet sent to the server was 176 ms ago.  
  37. 2008-02-18 10:52:53 ERROR Thread-4 com.feedsky.work.SrcStoreThread - java.lang.NullPointerException  
  38. 2008-02-18 10:52:53 INFO Thread-2 com.feedsky.dao.impl.SrcItemDAOImpl - com.mysql.jdbc.CommunicationsException:   
  39.   
  40. Communications link failure due to underlying exception:   
  41.   
  42. ** BEGIN NESTED EXCEPTION **   
  43.   
  44. java.io.EOFException  
  45.   
  46. STACKTRACE:  
  47.   
  48. java.io.EOFException  
  49.         at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1913)  
  50.         at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2304)  
  51.         at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2803)  
  52.         at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1573)  
  53.         at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1665)  
  54.         at com.mysql.jdbc.Connection.execSQL(Connection.java:3170)  
  55.         at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1316)  
  56.         at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1235)  
  57.         at com.mchange.v2.c3p0.impl.NewProxyStatement.executeUpdate(NewProxyStatement.java:64)  
  58.         at com.feedsky.dao.impl.SrcItemDAOImpl.insert(SrcItemDAOImpl.java:178)  
  59.         at com.feedsky.service.impl.SrcItemServiceImpl.save(SrcItemServiceImpl.java:29)  
  60.         at com.feedsky.controller.SrcFeedController.saveSrcFeed(SrcFeedController.java:111)  
  61.         at com.feedsky.work.SrcStoreThread.saveSrcFeed(SrcStoreThread.java:174)  
  62.         at com.feedsky.work.SrcStoreThread.run(SrcStoreThread.java:53)  
  63.         at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:748)  
  64.         at java.lang.Thread.run(Thread.java:619)  
  65.   
  66.   
  67. ** END NESTED EXCEPTION **  



出现这种异常的原因是:

Mysql服务器默认的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该 connection。这就是问题的所在,在C3P0 pools中的connections如果空闲超过8小时,Mysql将其断开,而C3P0并不知道该connection已经失效,如果这时有 Client请求connection,C3P0将该失效的Connection提供给Client,将会造成上面的异常。


解决办法:
Java代码  收藏代码
  1. public synchronized static DataSource createDataSource(String driver,String url,String username,String password) throws SQLException, ClassNotFoundException {  
  2.           
  3.         Class.forName(driver);  
  4.           
  5.         DataSource ds_unpooled = DataSources.unpooledDataSource(url,username,password);   
  6.           
  7.         Map overrides = new HashMap();   
  8.         //当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3   
  9.         overrides.put("acquireIncrement"5);  
  10.         overrides.put("minPoolSize"5);  
  11.         overrides.put("maxPoolSize"10);  
  12.         //overrides.put("initialPoolSize",cfg.getMaxPoolSize());  
  13.         overrides.put("maxStatements"10000);  
  14.         //最大空闲时间,3600秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0  
  15.         overrides.put("maxIdleTime"3600 );  
  16.         overrides.put("automaticTestTable""C3P0TestTable");  
  17.         overrides.put("testConnectionOnCheckin"true);  
  18. //      每60秒检查所有连接池中的空闲连接。Default: 0  
  19.         overrides.put("idleConnectionTestPeriod",18000);  
  20.         overrides.put("testConnectionOnCheckout"true);  
  21.         //获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效   
  22.         //保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试   
  23.         //获取连接失败后该数据源将申明已断开并永久关闭。Default: false   
  24.         overrides.put("breakAfterAcquireFailure"true);  
  25.           
  26.         //c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能   
  27.         //通过多线程实现多个操作同时被执行。Default: 3  
  28.         overrides.put("numHelperThreads"10);  
  29.           
  30.         // create the PooledDataSource using the default configuration and our overrides  
  31.         DataSource ds_pooled = DataSources.pooledDataSource( ds_unpooled, overrides );  
  32.         return ds_pooled;   
  33.     }  



注意参数:

//如果设为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参数值
分享到:
评论

相关推荐

    mysql 异常com.mysql.jdbc.CommunicationsException

    在这个案例中,C3P0连接池中的某些连接由于长时间空闲而被MySQL服务器断开,但是C3P0连接池并不知道这些连接已经失效,当客户端再次请求这些连接时,就产生了`CommunicationsException`异常。 #### 解决方案 根据...

    mysql-connector-java-5.1.49

    在生产环境中,为了提高效率和资源管理,通常会使用连接池(如C3P0、HikariCP、DBCP等),这些连接池库会管理数据库连接的生命周期,避免频繁创建和关闭连接。 6. **事务处理**: MySQL Connector/J支持JDBC的...

    mysql-connector-java-5.1.18.rar

    为了提高性能和资源管理,开发人员可以利用第三方连接池,如C3P0、HikariCP或Apache DBCP,与MySQL Connector/J结合使用。这些连接池管理数据库连接的创建、复用和关闭,避免了频繁创建和销毁连接的开销。 6. **...

    mysql-connector-java-5.1.rar

    6. **连接池支持**:在大型应用中,为了提高性能和资源利用率,可以使用连接池,如C3P0、HikariCP或Apache DBCP。这些连接池库可以与MySQL Connector/J配合使用,高效管理数据库连接。 7. **游标支持**:游标允许...

    非常有用的jdbc的操作数据库

    例如,C3P0、DBCP、HikariCP等都是常用的JDBC连接池实现。连接池会在初始化时创建一定数量的连接,应用程序需要时可以从池中获取,使用完毕后归还,而不是每次都新建和关闭连接。 **五、JDBC优化技巧** 1. 使用...

    JDBC(ORACLE)

    例如,使用Apache的Commons DBCP或C3P0库。 ### SQL操作 1. **查询**:通过`Statement.executeQuery()`执行SQL SELECT语句,返回ResultSet对象表示结果集。 2. **插入、更新、删除**:使用`Statement....

    JDBC学习笔记(含思维导图).zip

    2. **连接池**: 为提高性能和资源利用率,可以使用连接池如C3P0、HikariCP等管理数据库连接,避免频繁创建和关闭连接。 3. **CallableStatement**: 用于调用数据库的存储过程,可以处理带有输入、输出和输入/输出...

    mysql-connector-java.zip

    - **连接池**:在大型应用中,使用连接池(如C3P0、HikariCP、Apache DBCP等)可以有效地管理和重用数据库连接。 - **异常处理**:处理SQLException及其子类异常,如CommunicationsException、DataAccessException等...

    mysql-connector-java-5.0.6

    常见的连接池实现有C3P0、HikariCP、Druid等,它们都支持MySQL Connector/J。 9. **异常处理**:当数据库操作发生错误时,会抛出`SQLException`及其子类,如`CommunicationsException`、`DataAccessException`等,...

    JDBC实现Mysql自动重连机制的方法详解

    3. **C3P0连接池配置**:如果你使用C3P0作为数据库连接池,可以通过以下配置启用连接测试和自动重连: ```xml <property name="hibernate.c3p0.acquire_increment">1 <property name="hibernate.c3p0.idle_test_...

    数据库驱动

    使用JDBC时,还需要注意连接池的概念,如Apache的Commons DBCP或C3P0,它们可以提高性能,避免频繁创建和关闭数据库连接。此外,JDBC的异常处理也很重要,如`SQLException`,以及它的子类,如`...

    Java语言SQL接口 JDBC编程技术

    13. **连接池**:为了优化性能和资源管理,开发者通常使用连接池(如C3P0、HikariCP、Apache DBCP等)来复用数据库连接。 14. **JDBC 4.0及以后版本的新特性**:自动注册驱动、改进的异常处理、统一的元数据API、...

    JDBC-EXAMPLE

    为了提高应用性能和资源利用率,通常会使用连接池(如C3P0、HikariCP、Apache DBCP等)来管理和复用数据库连接。 **总结** JDBC是Java与数据库交互的核心工具,理解并熟练掌握其使用方法对Java开发者至关重要。...

Global site tag (gtag.js) - Google Analytics