守听 发表于 2024-6-21 13:07:40

quartz和数据库断连接:Couldn‘t rollback jdbc connection. No operation

##  JDBC连接回滚失败题目
```xml
Couldn't rollback jdbc connection. No operations allowed after connection closed. \ncom.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
    at sun.reflect.GeneratedConstructorAccessor107.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.Util.getInstance(Util.java:386)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920)
    at com.mysql.jdbc.ConnectionImpl.throwConnectionClosedException(ConnectionImpl.java:1304)
    at com.mysql.jdbc.ConnectionImpl.checkClosed(ConnectionImpl.java:1296)
    at com.mysql.jdbc.ConnectionImpl.rollback(ConnectionImpl.java:5022)
    at com.mchange.v2.c3p0.impl.NewProxyConnection.rollback(NewProxyConnection.java:855)
    at sun.reflect.GeneratedMethodAccessor2556.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.quartz.impl.jdbcjobstore.AttributeRestoringConnectionInvocationHandler.invoke(AttributeRestoringConnectionInvocationHandler.java:73)
    at com.sun.proxy.$Proxy323.rollback(Unknown Source)
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.rollbackConnection(JobStoreSupport.java:3650)
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInNonManagedTXLock(JobStoreSupport.java:3809)
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.acquireNextTriggers(JobStoreSupport.java:2756)
    at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:272)\nCaused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet successfully received from the server was 5,458,082 milliseconds ago.  The last packet sent successfully to the server was 0 milliseconds ago.
    at sun.reflect.GeneratedConstructorAccessor263.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1121)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3603)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3492)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4043)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2503)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2664)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2809)
    at com.mysql.jdbc.ConnectionImpl.unsetMaxRows(ConnectionImpl.java:5782)
    at com.mysql.jdbc.StatementImpl.realClose(StatementImpl.java:2605)
    at com.mysql.jdbc.PreparedStatement.realClose(PreparedStatement.java:3158)
    at com.mysql.jdbc.ConnectionImpl.closeAllOpenStatements(ConnectionImpl.java:1658)
    at com.mysql.jdbc.ConnectionImpl.realClose(ConnectionImpl.java:4690)
    at com.mysql.jdbc.ConnectionImpl.cleanup(ConnectionImpl.java:1464)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2843)
    at com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:5333)
    at com.mchange.v2.c3p0.impl.NewProxyConnection.setAutoCommit(NewProxyConnection.java:881)
    at org.quartz.impl.jdbcjobstore.AttributeRestoringConnectionInvocationHandler.setAutoCommit(AttributeRestoringConnectionInvocationHandler.java:98)
    at org.quartz.impl.jdbcjobstore.AttributeRestoringConnectionInvocationHandler.invoke(AttributeRestoringConnectionInvocationHandler.java:66)
    at com.sun.proxy.$Proxy323.setAutoCommit(Unknown Source)
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.getConnection(JobStoreSupport.java:799)
    at org.quartz.impl.jdbcjobstore.JobStoreTX.getNonManagedTXConnection(JobStoreTX.java:71)
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInNonManagedTXLock(JobStoreSupport.java:3784)
    ... 2 common frames omitted\nCaused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3052)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3503)
    ... 22 common frames omitted
   ```
### 错误概述
在数据库事务管理过程中,我们遭遇了一个关键错误:“Couldn't rollback jdbc connection. No operations allowed after connection closed.” 这表明在执行回滚操纵时,JDBC连接已经关闭。

### 错误详情
- **错误信息**:操纵不答应,连接已关闭。
- **非常类型**:`MySQLNonTransientConnectionException`。
- **根本原因**:连接超时或非常断开。

### 错误影响
- 事务无法正常回滚,大概导致数据差异等性。
- 定时使命执行失败,影响体系稳定性和可靠性。

### 题目分析
- **连接关闭**:执行回滚操纵时连接已关闭。
- **连接超时**:由于`wait_timeout`设置,连接超时断开。
- **Quartz设置**:Quartz定时器使用c3p0连接池,设置不当大概导致连接题目。

### 办理计谋探索
1. **autoReconnect=true方案**:
   - 开端考虑使用`autoReconnect=true`参数,该参数答应在连接断开时主动重新连接。
   - 经研究,此方案在生产环境中不保举使用,且仅在非常断开时有效,对正常关闭或超时关闭无效。

2. **服务端设置**:
   - 理想环境下,通过修改MySQL设置延长连接维持时间。
   - 由于权限限定,无法直接修改MySQL设置。

3. **客户端验证**:
   - 从客户端出发,校验从连接池获取的连接有效性。

### 办理方案
1. **启用连接验证**:
   - 在Quartz设置中设置`validateOnCheckout`为`true`,确保每次从连接池获取的连接都是有效的。
   - 使用简单的SQL查询作为验证语句,例如:`SELECT 1`。

2. **设置示例**:
   ```xml
   <prop key="org.quartz.dataSource.member.validateOnCheckout">true</prop>
   <prop key="org.quartz.dataSource.member.validationQuery">SELECT 1</prop>
   ```

3. **监控与日志**:
   - 加强体系监控,及时发现并相应连接题目。
   - 美满日志记录,便于题目追踪和分析。

### 经验辅导
- **预防步调**:定期检察和测试数据库连接设置,确保连接池管理计谋的有效性。
- **权限管理**:在无法修改服务端设置时,需要灵活调整客户端计谋,探求可行的替代方案。
- **参数慎用**:对于`autoReconnect=true`等参数,需充分评估其适用性和潜在风险。

### 结论
通过在客户端实施连接验证计谋,我们乐成办理了JDBC连接回滚失败的题目。这一经验强化了我们对于数据库连接管理的认识,也提醒我们在面对权限限定时,需要探求可行的替代方案。同时,对于主动重连等参数的使用,我们应持审慎态度,避免在生产环境中引入不须要的风险。
参考文章:quartz非常:Couldn't rollback jdbc connection_couldn't rollback jdbc connection. no operations a-CSDN博客

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: quartz和数据库断连接:Couldn‘t rollback jdbc connection. No operation