druid连接池使用过程遇到的一个奇怪异常

某天日志中连续都是如下的异常:

2017-09-06 21:39:52.936 ERROR [DruidDataSource.java:1974] create connection holder error

org.postgresql.util.PSQLException: ERROR: current transaction is aborted, commands ignored until end of transaction block

at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2476) ~[postgresql-42.1.1.jar:42.1.1]

at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2189) ~[postgresql-42.1.1.jar:42.1.1]

at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:300) ~[postgresql-42.1.1.jar:42.1.1]

at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:428) ~[postgresql-42.1.1.jar:42.1.1]

at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:354) ~[postgresql-42.1.1.jar:42.1.1]

at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:301) ~[postgresql-42.1.1.jar:42.1.1]

at org.postgresql.jdbc.PgStatement.executeCachedSql(PgStatement.java:287) ~[postgresql-42.1.1.jar:42.1.1]

at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:264) ~[postgresql-42.1.1.jar:42.1.1]

at org.postgresql.jdbc.PgConnection.execSQLQuery(PgConnection.java:416) ~[postgresql-42.1.1.jar:42.1.1]

at org.postgresql.jdbc.PgConnection.execSQLQuery(PgConnection.java:410) ~[postgresql-42.1.1.jar:42.1.1]

at org.postgresql.jdbc.PgConnection.getTransactionIsolation(PgConnection.java:793) ~[postgresql-42.1.1.jar:42.1.1]

at com.alibaba.druid.filter.FilterChainImpl.connection_getTransactionIsolation(FilterChainImpl.java:362) ~[druid-1.1.0.jar:1.1.0]

at com.alibaba.druid.filter.FilterAdapter.connection_getTransactionIsolation(FilterAdapter.java:871) ~[druid-1.1.0.jar:1.1.0]

at com.alibaba.druid.filter.FilterChainImpl.connection_getTransactionIsolation(FilterChainImpl.java:359) ~[druid-1.1.0.jar:1.1.0]

at com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl.getTransactionIsolation(ConnectionProxyImpl.java:260) ~[druid-1.1.0.jar:1.1.0]

at com.alibaba.druid.pool.DruidConnectionHolder.<init>(DruidConnectionHolder.java:145) ~[druid-1.1.0.jar:1.1.0]

at com.alibaba.druid.pool.DruidConnectionHolder.<init>(DruidConnectionHolder.java:84) ~[druid-1.1.0.jar:1.1.0]

at com.alibaba.druid.pool.DruidDataSource.put(DruidDataSource.java:1964) ~[druid-1.1.0.jar:1.1.0]

at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:2221) [druid-1.1.0.jar:1.1.0]

Caused by: org.postgresql.util.PSQLException: ERROR: canceling statement due to user request

at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2476) ~[postgresql-42.1.1.jar:42.1.1]

at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2189) ~[postgresql-42.1.1.jar:42.1.1]

at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:300) ~[postgresql-42.1.1.jar:42.1.1]

at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:428) ~[postgresql-42.1.1.jar:42.1.1]

at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:354) ~[postgresql-42.1.1.jar:42.1.1]

at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:301) ~[postgresql-42.1.1.jar:42.1.1]

at org.postgresql.jdbc.PgStatement.executeCachedSql(PgStatement.java:287) ~[postgresql-42.1.1.jar:42.1.1]

at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:264) ~[postgresql-42.1.1.jar:42.1.1]

at org.postgresql.jdbc.PgStatement.executeQuery(PgStatement.java:231) ~[postgresql-42.1.1.jar:42.1.1]

at com.alibaba.druid.pool.vendor.PGValidConnectionChecker.isValidConnection(PGValidConnectionChecker.java:65) ~[druid-1.1.0.jar:1.1.0]

at com.alibaba.druid.pool.DruidAbstractDataSource.validateConnection(DruidAbstractDataSource.java:1293) ~[druid-1.1.0.jar:1.1.0]

at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1539) ~[druid-1.1.0.jar:1.1.0]

at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:2178) [druid-1.1.0.jar:1.1.0]

最后查找资料,查看druid源代码,终于找到了原因,在数据库建立连接时,会检查连接状况:

(!= ) {
    result = ;
    Exception error = ;
    {
        result = .isValidConnection(conn, , );
    } (Exception ex) {
        error = ex;
    }
    
    (!result) {
        SQLException sqlError = error != ? SQLException(, error) : SQLException();
        sqlError;
    }
    ;
}

由于我们使用的是postgres数据库,在PGValidConnectionChecker代码中

int queryTimeout = validationQueryTimeout < 0 ? defaultQueryTimeout : validationQueryTimeout;

Statement stmt = ;
ResultSet rs = ;
{
    stmt = conn.createStatement();
    stmt.setQueryTimeout(queryTimeout);
    rs = stmt.executeQuery(validateQuery);
    ;

此处validationQueryTime默认值-1,defaultQueryTimeout则为1,这就造成执行sql语句需要在1秒内返回,偏偏那时候我们数据库正处于非常复杂的计算中,没有及时响应,就抛出了

如下异常Caused by: org.postgresql.util.PSQLException: ERROR: canceling statement due to user request,然后更有趣的事情发生了

这段代码是数据源建立连接的时候,测试连接是否通顺运行的,抛出异常后,

由于此处result默认为true,抛出异常也没有更改result为false,然后该连接会被正常使用,由于本身该连接使用过程中已经出现过异常,再次使用就会抛出

ERROR [DruidDataSource.java:1974] create connection holder error

org.postgresql.util.PSQLException: ERROR: current transaction is aborted, commands ignored until end of transaction block

由于druid的连接池未满,所以不停的创建连接,接连不断抛出如上异常

时间: 2024-08-02 09:56:19

druid连接池使用过程遇到的一个奇怪异常的相关文章

SpringMVC+Spring+Mybatis整合,使用druid连接池,声明式事务,maven配置

一直对springmvc和mybatis挺怀念的,最近想自己再搭建下框架,然后写点什么. 暂时没有整合缓存,druid也没有做ip地址的过滤.Spring的AOP简单配置了下,也还没具体弄,不知道能不能用,log也不知道能不能用,`(*∩_∩*)′哈哈,有点不负责任...... 直接上代码: 使用的eclipse和eclipse自带的maven,参考了网上的资料,有些代码是拷贝的,不过都自己测试过了.嗯,可以跑起来... 先上项目结构: 新建maven项目,选择web,然后配置pom: <pro

Druid连接池-阿里巴巴开源JDBC组件

Druid在连接池领域里可以说是比较火的,是阿里巴巴开源的JDBC连接池.监控组件,下面就简单介绍它一下. 它包括三部分:  DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系. DruidDataSource 高效可管理的数据库连接池. SQLParser . 功能:     .  可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助.     .  替换D

spring 4 + jpa(hibernate 3/4) + spring mvc 多数据源配置(二)+Druid连接池

接上一个博文(http://www.loveweir.com/html/18.html),没有数据库连接池,纯粹用jpa的官方链接. 所以这次要加上连接池本文用Druid连接池来实现多数据源的配置. persistence.xml 这个文件可以省略了,全部配置在applicationContext.xml 里面: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www

Druid连接池及监控在spring中的配置

Druid连接池及监控在Spring配置如下: [html] view plaincopy <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!-- 基本属性 url.user.password --> <property 

druid连接池

近期一直报连接池连接的错误,主要就是那个什么last packet 多少ms以前. 所以就研究了下. druid连接池和mysql的连接关系可以简单理解为下面的案例. 有10个接线员A和远程10个接口员B在通讯,如果不用连接池,那么每用一次就要拨号.建立链接.通话.挂断,非常浪费时间.所以如果10个接线员A提前就和B接通,然后一直不挂断,这样需要时只要喊话一下就行了,效率高,真正的基于TCP连接可以参考下载 但是这样会导致一个问题,如果B偷懒,偷偷的将电话挂断,而A不知道,再讲话就会出错了. 针

SpringBoot配置MySql数据库和Druid连接池

1.pom文件增加相关依赖,我这里因为上面引入了父pom,所以不需要在当前pom文件下加版本 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifact

springboot+druid连接池及监控配置

1. 问题描述 阿里巴巴的数据库连接池Druid在效率与稳定性都很高,被很多开发团队使用,并且自带的Druid监控也很好用,本章简单介绍下springboot+druid配置连接池及监控. 2. 解决方案 2.1 pom.xml springboot 已经有druid的starter,但是好像有点问题,不知道为什么没拿到jar包,有可能是网络问题,还是使用了原生的druid gav. <dependency> <groupId>com.alibaba</groupId>

Druid连接池(无框架)

关于连接池有不少技术可以用,例如c3p0,druid等等,因为druid有监控平台,性能在同类产品中算top0的.所以我采用的事druid连接池. 首先熟悉一个技术,我们要搞明白,为什么要用他, 他能帮我们解决什么问题? 如果不使用连接池会出现的情况:a.占用服务器的内存资源b.导致服务器的速度非常慢1.准备 下载druid1.9的jar包和对应数据库的驱动包. https://mvnrepository.com/artifact/com.alibaba/druid/1.0.9 2.代码 2.1

##Druid连接池,目前全球最出名,也是最常用的连接池,阿里出品,好用到极点,你值得拥有

Druid连接池 在之前我分享过C3P0连接池这个工具类的用法以及具体的代码,今天给大家介绍一款阿里提供的连接池,这也是以后我们常用的,毕竟现在这个连接池是全球公认的最出名,最好用的连接池工具类. ##一,Druid是一个JDBC组件,它包括三部分: DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系.  DruidDataSource 高效可管理的数据库连接池.  SQLParser  ##二,Druid可以做什么?  1) 可以监控数据库访问性能,D