最近的一个项目在Hibernate使用C3P0的连接池,数据库为Mysql。开发测试没有问题,在运行中每个一段长的空闲时间就出现异常:
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的文档。
分享到:
相关推荐
could not execute:bad executable format(win32 error 193) 下了一个实现MD5的代码,编译时没有错误,但是执行的时候却提示:could not execute:bad executable format(win32 error 193)
在使用Maven构建Java项目时,可能会遇到这样一个错误:“Failed to execute goal on project …: Could not resolve dependencies for project …”。这个错误通常表明Maven在构建过程中遇到了依赖解析问题,无法...
用户可以将Windump捕获的.pcapng或.pcap文件导入Wireshark,以进行更深入的协议解析和数据分析。 总的来说,Windump和WinPcap是网络诊断和分析的强大组合,它们可以帮助IT专业人员深入了解网络流量,发现潜在的问题...
SQLGrammerException, Could not execute JDBC batch update 当执行批量更新操作时,如果SQL语法错误或数据库不支持批处理,可能会遇到此异常。检查SQL语句的语法正确性,以及数据库驱动是否支持所需的批处理功能...
警告: SQL Error: 156, ...org.hibernate.exception.SQLGrammarException: could not execute query org.hibernate.util.JDBCExceptionReporter logExceptions 严重: 关键字 'user' 附近有语法错误。 的解决方案。
nested exception is org.hibernate.exception.SQLGrammarException: could not execute query 这个错误是由于SQL语句有错误,导致查询失败。解决方法是检查SQL语句的正确性,确保语句正确无误。 4. 严重: Error ...
Exception in thread "main" org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update 或者org.springframework.jdbc.BadSqlGrammarException: Hibernate operation: could not insert: ...
nested exception is org.hibernate.exception.SQLGrammarException: could not execute query` 这个异常表明执行SQL查询时出现了语法错误。检查并修正相关的SQL语句,确保其符合SQL语法规范,并且与数据库表结构...
TypeError: Failed to execute ‘observe’ on ‘MutationObserver’: parameter 1 is not of type ‘Node’ InfiniteScroll的更多用法element官网 二、解决办法 给需要使用 InfiniteScroll 的元素或者它的父级...
**问题描述**:在使用Hibernate执行查询语句时,系统抛出`Nodefaultconstructorforentity`错误。 **可能原因**:该错误通常是由于实体类中缺少无参构造函数导致的。在Java中,如果一个类没有显式地定义任何构造函数...
Qt5.4下连接Mysql,QSqlDatabase: QMYSQL driver not loaded but available-附件资源
在将SSH项目从SQL Server 2005迁移至MySQL时,出现的“org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute query”异常通常意味着数据访问层在尝试执行SQL查询时遇到了问题。...
在Java持久化领域,Hibernate是一个广泛使用的对象关系映射(ORM)框架,它允许开发者将Java对象与数据库中的记录进行映射,简化了数据库操作。`save` 和 `persist` 是Hibernate Session接口中的两个方法,它们都...
idea创建Maven项目时,报错显示Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.0.2:resources,并且Maven插件内看不到 mybatis-generator。如下图: 折腾了好久发现配置放错地方了,...
### 解决Keil C51 编译器执行问题:“can't execute 'CKeilC51BINA51.EXE'.txt” 在使用Keil C51编译器的过程中,可能会遇到一个常见的错误提示:“can't execute 'CKeilC51BINA51.EXE'.txt”。这个问题通常出现在...
在IT行业中,"EXECUTE"通常与编程和脚本执行紧密相关。这可能是指在某个程序、脚本或操作系统命令中触发执行的动作。当我们谈论"EXECUTE"时,我们主要关注的是代码的运行过程,这涉及到计算机语言的理解、编译(如果...
mysqldump: Couldn’t execute ‘SET OPTION SQL_QUOTE_SHOW_CREATE=1’: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use ...
另一个常见的问题是在级联操作时,如级联删除,可能会遇到`Hibernate: Could not execute JDBC batch update`的错误。这通常是由于Hibernate在执行数据库更新操作时出现了问题。为了解决这个问题,我们需要在实体类...
在SAP系统中,"Execute Query Directly On The Server"是一种功能,允许用户直接在数据库服务器上执行查询,以提高数据检索效率并减轻客户端的负担。这种技术通常用于处理大量数据或复杂查询,以避免在客户端进行...
Linux中运行ifconfig出现错误解决方法[摘要]linux中运行ifconfig出现错误:正常情况下,只需要在控制面板上...不能sudoapTInstallnet-tools,出现这种问题时,解决方法是,首先输入:sudoapt-getupdate,然后输入:sud