MyBatis-Spring-Boot icon indicating copy to clipboard operation
MyBatis-Spring-Boot copied to clipboard

No operations allowed after statement closed.

Open helloworldtang opened this issue 7 years ago • 8 comments

这种报错在直接使用java.sql.Statement比较好处理。 但在spring boot 使用starter后需要怎么处理呢?

### Error updating database.  Cause: java.sql.SQLException: No operations allowed after statement closed.
### SQL: INSERT INTO car_tt  ( id,insertTime,tid) VALUES( ?,?,?)
### Cause: java.sql.SQLException: No operations allowed after statement closed.
; SQL []; No operations allowed after statement closed.; nested exception is java.sql.SQLException: No operations allowed after statement closed.
org.springframework.dao.TransientDataAccessResourceException: 
### Error updating database.  Cause: java.sql.SQLException: No operations allowed after statement closed.
### SQL: INSERT INTO car_tt  ( id,insertTime,tid) VALUES( ?,?,?)
### Cause: java.sql.SQLException: No operations allowed after statement closed.
; SQL []; No operations allowed after statement closed.; nested exception is java.sql.SQLException: No operations allowed after statement closed.
        at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:108)
        at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)
        at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
        at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
        at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)
        at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
        at com.sun.proxy.$Proxy79.insert(Unknown Source)
        at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:278)
        at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:57)
        at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
        at com.sun.proxy.$Proxy85.insert(Unknown Source)
```	

helloworldtang avatar May 24 '17 01:05 helloworldtang

做什么操作导致链接关闭了?

abel533 avatar May 24 '17 15:05 abel533

已经在mysqlUrl上添加"&autoReconnect=true" , dao都是使用通用mapper,没有关闭statement的逻辑。 代码中都没有出现SqlSessionTemplate

执行下面这个语句报了上面的错。

    public void insertCarTt(CarTtDO carTtDO) {
        carTtDOMapper.insert(carTtDO);
    }

helloworldtang avatar May 26 '17 05:05 helloworldtang

发现报statement关闭错误的上方都有一个mysql ”MySQLIntegrityConstraintViolationException: Duplicate entry“ 的异常

难道这两个报错之间有关联关系?

···java Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '862442030055280-1495778004781' for key 'index7' at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:422) at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) at com.mysql.jdbc.Util.getInstance(Util.java:408) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:935) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2501) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858) at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1197) at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:2931) at com.alibaba.druid.wall.WallFilter.preparedStatement_execute(WallFilter.java:601) at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:2929) at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapt ···

helloworldtang avatar May 26 '17 06:05 helloworldtang

加判断,对这种duplication entry进行预检查后,statement关闭的报错 没有再出现

操作db抛异常后,那个环节会关闭statement呢?

helloworldtang avatar May 26 '17 08:05 helloworldtang

不确定是哪个环节。。主键冲突是因为你重复插入同一个对象?

abel533 avatar May 26 '17 13:05 abel533

是的。出现重复是业务问题,客户端网络问题导致传了相同的数据。

我把这种情况在insert之前处理了,statement close的报错就没有再出现过

用过温少,他说druid没有close,

通用mapper也没有关的话。

现在只剩下排查mybatis的SqlSessionTemplate了

helloworldtang avatar May 26 '17 14:05 helloworldtang

你可以看一下这个commit:https://github.com/alibaba/druid/commit/1d7bc65b3d8f3d5dbaca7e45a8b1b9d78ed2a104,这个问题1.0.29之后已经解决了

Likenttt avatar Mar 08 '21 08:03 Likenttt

这个是druid的问题

Likenttt avatar Mar 08 '21 08:03 Likenttt