`
linmomo02
  • 浏览: 180601 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

数据库连接池获取坏死连接问题

 
阅读更多

Communications link failure due to underlying exception异常处理(转)

最近的一个项目在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的文档。

我也遇到这个问题了,请问如果使用hibernate自带的连接池应该怎么处理? autoReconnect=true 在新的connector/J版本里面已经deprecated了,文档里面建议不要使用. 不错的文章,问题钻研很仔细。 

 

另外可以试试看在JDBC URL上面加一个autoReconnect=true

分享到:
评论

相关推荐

    C#高效数据库连接池源码

    应用程序在需要时从池中获取连接,使用完毕后归还,而不是关闭。这样减少了频繁创建和关闭连接的开销,提高了数据库访问效率。 2. **C#与数据库交互**: C#通常通过ADO.NET框架与数据库进行交互。ADO.NET包含如...

    数据库连接池技术详解

    对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接的配置,实现数据库连接池技术。某一应用最大可用数据库连接数的限制,避免某一应用独占所有数据库资源。 在较为完备的数据库连接池实现中,可根据...

    C# 数据库连接池 C# 数据库连接池

    2. **Open() 和 Close()**:`Open()`方法从连接池获取连接,`Close()`方法不实际关闭连接,而是将其返回到连接池。 3. **ConnectionString属性**:在连接字符串中,可以设置`Pooling=true`来启用连接池,还可以通过...

    常用jdbc数据库连接jar包,数据库连接池jar包

    数据库连接池在初始化时会创建一定数量的数据库连接并保存起来,当应用程序需要连接时,可以从池中获取一个已存在的连接,而不是每次都去新建,用完后也不立即关闭,而是归还给连接池。这样可以显著减少建立和释放...

    03-数据库连接池驱动_数据库连接池;驱动_

    数据库连接池是现代应用程序开发中的重要组成部分,尤其是在处理大量数据交互的应用中,它极大地提高了数据库操作的效率和系统的稳定性。本资源"03-数据库连接池驱动"包含了三种常用的数据库连接池驱动:C3P0、Druid...

    c# mysql数据库连接池实现

    数据库连接池是一种资源管理技术,它预先创建并维护一定数量的数据库连接,当应用需要时,可以从池中获取连接,使用完毕后归还而不是直接关闭,从而减少了频繁创建和销毁连接的开销。在.NET Core中,对于MySQL数据库...

    Qt 多线程连接数据库——数据库连接池

    * 获取连接时不需要了解连接的名字,连接池内部维护连接的名字 * 支持多线程,保证获取到的连接一定是没有被其他线程正在使用 * 按需创建连接,可以创建多个连接,可以控制连接的数量 * 连接被复用,不是每次都...

    数据库连接池的例子数据库连接池的例子

    4. **获取和释放连接**:`getConnection()` 和 `freeConnection()` 方法分别用于从连接池获取连接和将使用完毕的连接放回池中。`getConnection()` 方法有两重实现,一种是无等待时间的,另一种则是可以设置超时时间...

    数据库连接池驱动包_数据库连接池驱动包_

    数据库连接池是现代数据库应用程序中的重要组成部分,它有效地管理和优化了数据库连接的创建、分配和回收,从而提高系统的性能和资源利用率。本压缩包包含了几个常见的数据库连接池驱动包,这些驱动包为开发者提供了...

    数据库连接池java代码实现

    `getConnection()`方法负责从池中获取连接,如果池中没有空闲连接且总连接数未达到最大值,就创建新的连接;`returnConnection()`方法用于归还连接,同时检查连接是否合法,防止重复归还。`cleanUp()`方法定期清理...

    C# 数据库连接池

    数据库连接池是一组预先初始化的数据库连接,当程序需要与数据库建立连接时,可以从池中获取一个已经存在的连接,而不是每次都创建新的连接。使用完毕后,连接不会立即关闭,而是返回到连接池中供后续使用。这样可以...

    达梦7数据库连接池,jdbcDriver

    达梦7数据库连接池,jdbcDriver,达梦7数据库连接池,jdbcDriver,达梦7数据库连接池,jdbcDriver,达梦7数据库连接池,jdbcDriver,达梦7数据库连接池,jdbcDriver,达梦7数据库连接池,jdbcDriver,

    配置数据库连接池

    数据库连接池的基本思想是预先创建并维护一定数量的数据库连接,当应用需要与数据库通信时,可以快速地从连接池中获取一个已建立的连接,而不是每次都新建一个。用完后,连接会归还到池中,供其他请求使用,而不是...

    数据库连接池c3p0jar包

    6. `testConnectionOnCheckout`:每次从连接池获取连接时是否进行检查,以确保连接的有效性。 **C3P0的使用** 在Java项目中,通常通过以下步骤配置和使用C3P0连接池: 1. 将C3P0的jar包(如`c3p0.jar`)添加到项目...

    数据库连接池配置文件

    context.xml, 数据库连接池配置文

    MySql数据库连接池C#代码(有注释含测试代码)

    MySQL数据库连接池是提高应用程序性能的一种重要技术,它允许开发者管理多个数据库连接并高效地复用这些连接,而不是每次需要时都创建新的连接。在C#编程中,我们可以使用自定义的连接池或者第三方库如ADO.NET的...

Global site tag (gtag.js) - Google Analytics