在基于postgresql10的项目上,使用springboot + druid连接数据库时发生如下异常:

Error creating bean with name 'dataSource' defined in class path resource [spring-jdbc.xml]: Invocation of init method failed; nested exception is org.postgresql.util.PSQLException: 这个 ResultSet 已经被关闭

异常环境

针对该异常的环境如下:

使用druid版本:1.1.5,连接postgresql 10.0-1版本的数据库时报错
环境:win7-64
语言:java
Error creating bean with name 'dataSource' defined in class path resource [spring-jdbc.xml]: Invocation of init method failed; nested exception is org.postgresql.util.PSQLException: 这个 ResultSet 已经被关闭。
查看paAdmin,可以看到有pg driver的连接,但是无法在项目中启动,换org.apache.commons.dbcp.BasicDataSource就没问题,怀疑是druid无法初始化这个postgresql的版本为datasource,有时间调试源码确认下,在这先提交个issues

异常追踪

针对发生异常进行追踪分析:

用1.1.6/5/4等多个版本,连接postgresql10的时候有问题,但是连接postgresql 9.6 就没有问题。异常与上面相同。

调查发现: 在调用“select ‘x’ ”测试连接时,这个请求时没有问题的,能够正常返回结果。然后连接池会调用“com.alibaba.druid.filter.FilterChainImpl.connection_getTransactionIsolation“是,发起了一个sql查询”SHOW TRANSACTION ISOLATION level“。 但是这个sql查询设置的类型是 ”no data“,实际上在查询时正确的返回了结果 ”read committed“ ,由于这个标记的原因,后续处理就乱了,在new resultset的时候,没有,结果tuples为空。导致爆出了上面的按个错误”org.postgresql.util.PSQLException: 这个 ResultSet 已经被关闭“。 实际上这个错误是一个假象。

猜测验证

  1. 怀疑postgresq驱动有问题,看到druid使用的是9.3,在DBeaver上使用9.3驱动配置连接,可以连接成功。且执行命令 ”SHOW TRANSACTION ISOLATION level“ 也能正确返回 “read committed”表面上看驱动没有问题。
  2. 但是跟踪一下发现端倪。在读取结果填充tuples的时候, 结果都能从输入流中正确解析出来,”read committed” , 但是出来的地方不同,9.3的驱动链接版本10的数据库,走到了分子D,后续就不正确了。
    而9.3的客户端连接posgresql10,走到分支C,后续处理都正常。

##1和2看起来是矛盾的。但是确实存在此现象。尝试下载一个更新的posgtresql jdbc驱动替换现有驱动。

解决方案

修改为postgresql jdbc的最新驱动就可以了。 如果使用maven维护工程的话,在pom.xml中加上:

<!--druid连接池-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.6</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
    <!--必须使用支持pg10的新驱动。老驱动虽然在debeaver等工具上能工作,
    但是由于druid会调用SHOW TRANSACTION ISOLATION level 比较连接池设置的隔离级别和数据库的级别。
    老版本的jdbc驱动在跟postgresql-10执行此命令时会出错。
    -->
    <dependency>
      <groupId>org.postgresql</groupId>
      <artifactId>postgresql</artifactId>
      <version>42.1.4</version>
    </dependency>


postgresql10 springboot连接异常插图

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:http://choupangxia.com/2020/06/30/postgresql10-springboot-exception/