PSQLException: 这个 statement 已经被关闭 解决办法

报错触发条件:

在进行正常的JDBC查询的时候,根据id查询多表信息并返回map集合,首先正常查询几次之后进行空值查询时报错,重启服务后正常,一旦查询报错以后每次正常查询都报错.

报错信息如下:

{
    "code": 500,
    "msg": "Could not set parameters for mapping: ParameterMapping{property='applyid', mode=IN, javaType=class java.lang.Object, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #1 with JdbcType null . Try setting a different JdbcType for this parameter or a different configuration property. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #1 with JdbcType null . Try setting a different JdbcType for this parameter or a different configuration property. Cause: org.postgresql.util.PSQLException: 这个 statement 已经被关闭。",
    "data": null
}

PSQLException: 这个 statement 已经被关闭 解决办法_第1张图片

错误分析:

根据最后一行Exception,这个statement已经被关闭和后台日志打印有连接池的错误,考虑到错误可能会和数据库连接池有关系,项目使用的是阿里巴巴的Druid连接池,排查了数据库连接配置和请求源码无果后,查询相关资料发现是Druid的问题.

错误原因:

问题就出在druid连接池上, 连接池在执行完某一条错误的SQL以后, 报错信息会被保存在执行SQL的线程中, 当下一条拿到这个线程的SQL执行时, 就直接报错,而不会去执行SQL, 解决这个问题最简单的办法就是重启, 因为重启以后, 会清空线程池,所有线程都会重新启动, 问题线程自然会清除掉了, 但是当你点击某个会报错的sql时, 就又出问题了,而且报错的sql不会导致当前操作失败, 而只保留问题线程,所以从功能上看完全看不出哪里出了问题, 但是后台会有报错信息日志.

解决方案:

暴力且直接,只需要将pom文件里的Druid的版本从1.0.28升级到1.0.29即可.

在这里插入图片描述
修改为
在这里插入图片描述
即可

参考:

这里参考了csdn博主孙百度的博客,原文链接:
链接
https://blog.csdn.net/sun123_123/article/details/80533613

你可能感兴趣的:(jdbc)