java - 无法切换自动提交

标签 java mysql hibernate jdbc

我有一个事务在 Java 层中运行了多个小时,当 Hibernate 尝试保留整理的数据时,会引发如下所示的异常堆栈跟踪。

注意:我还尝试了指定的配置..

http://forums.mysql.com/read.php?39,52805,205216#msg-205216http://forums.mysql.com/read.php?39,52805,273371#msg-273371

++++++

ERROR org.hibernate.transaction.JDBCTransaction (JDBCTransaction.java:232) - Could not toggle autocommit 
java.sql.SQLException: 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.io.EOFException 

STACKTRACE: 

java.io.EOFException 
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1903) 
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2349) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2860) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1571) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1666) 
    at com.mysql.jdbc.Connection.execSQL(Connection.java:2972) 
    at com.mysql.jdbc.Connection.commit(Connection.java:2147) 
    at org.apache.commons.dbcp.DelegatingConnection.commit(DelegatingConnection.java:301) 
    at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.commit(PoolingDataSource.java:200) 
    at org.hibernate.transaction.JDBCTransaction.commitAndResetAutoCommit(JDBCTransaction.java:170) 
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:146) 
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:656) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:394) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:117) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:625) 

最佳答案

MySQL 有一个默认的超时期限,超过该期限就会终止空闲连接。默认情况下,该时间段为 8 小时。

然而,DBCP 并不知道连接何时被 MySQL 服务器终止,因此这些过时的连接仍会按需分发给应用程序。因此你会得到一个异常。

修复方法是将以下属性添加到 dbcp 配置中:

  • validationQuery=”SELECT 1″
  • testOnBorrow=”true”

这告诉 DBCP 验证与该查询的连接。

关于java - 无法切换自动提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4761726/

相关文章:

mysql - 使用mysqlbinlog命令找不到文件

java - 同步spring事务

hibernate - 如何在 Hibernate 中使用 new() 语法选择包括列表的部分对象

java - Mockito 测试 - 测试 write() 方法导致 NullPointerException

java - 如何混淆 ProGuard 中的库 jar?

mysql - 用于计算 Haversine 距离的自定义 MySQL 函数?

java - 将 OneToMany 方映射为所有者

java - 即使在 jsp 中,.jspf 也无法编译

java - File/FileInputStream 相对路径奇怪的行为

php - 获取mysql中列的总和