postgresql10 springboot连接异常
在基于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 已经被关闭“。 实际上这个错误是一个假象。
猜测验证
- 怀疑postgresq驱动有问题,看到druid使用的是9.3,在DBeaver上使用9.3驱动配置连接,可以连接成功。且执行命令 ”SHOW TRANSACTION ISOLATION level“ 也能正确返回 “read committed”表面上看驱动没有问题。
- 但是跟踪一下发现端倪。在读取结果填充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>
关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台
除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接
本文链接:https://choupangxia.com/2020/06/30/postgresql10-springboot-exception/