alibaba / druid

阿里云计算平台DataWorks(https://help.aliyun.com/document_detail/137663.html) 团队出品,为监控而生的数据库连接池
https://github.com/alibaba/druid/wiki
Apache License 2.0
27.89k stars 8.57k forks source link

与mariadb配合关闭连接失败 #5053

Open zhangfan791 opened 1 year ago

zhangfan791 commented 1 year ago

关闭连接失败 配置如下: druid.setInitialSize(0); druid.setMinIdle(0); druid.setMaxActive(10); druid.setMaxWait(5000); druid.setValidationQuery(connectionSpec.getValidationQuery()); druid.setTestOnBorrow(true); // 影响效率 druid.setTestOnReturn(false); druid.setTestWhileIdle(true); druid.setKeepAlive(true); druid.setTimeBetweenEvictionRunsMillis(60000); druid.setMinEvictableIdleTimeMillis(300000);

    druid.setBreakAfterAcquireFailure(false); // 默认false,如果数据库异常,DRUID会一直获取连接
    druid.setConnectionErrorRetryAttempts(1); // 设置获取连接出错时的自动重连次数
    druid.setTimeBetweenConnectErrorMillis(30000); // 两次重试的休眠时间
    // 设置FailFast为true,获取连接失败后不阻塞
    druid.setFailFast(true);
    druid.setLogAbandoned(true);
    druid.setQueryTimeout(1800);

[2022-11-22 18:23:11.826][ERROR][][1262595][incre_capture_45e7b03e-9660-4ad6-a586-20f59f87550c][recyle error][DruidDataSource.java recycle 2044] java.sql.SQLSyntaxErrorException: (conn=1619345) Connection.clearWarnings cannot be called on a closed connection at org.mariadb.jdbc.internal.util.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) ~[mariadb-java-client-2.7.5.jar:?] at org.mariadb.jdbc.internal.util.exceptions.ExceptionFactory.create(ExceptionFactory.java:176) ~[mariadb-java-client-2.7.5.jar:?] at org.mariadb.jdbc.MariaDbConnection.clearWarnings(MariaDbConnection.java:1024) ~[mariadb-java-client-2.7.5.jar:?] at com.alibaba.druid.pool.DruidConnectionHolder.reset(DruidConnectionHolder.java:331) ~[druid-1.2.10.jar:1.2.10] at com.alibaba.druid.pool.DruidDataSource.recycle(DruidDataSource.java:1951) ~[druid-1.2.10.jar:1.2.10] at com.alibaba.druid.pool.DruidPooledConnection.recycle(DruidPooledConnection.java:351) ~[druid-1.2.10.jar:1.2.10] at com.alibaba.druid.pool.DruidPooledConnection.close(DruidPooledConnection.java:288) ~[druid-1.2.10.jar:1.2.10]

kimmking commented 1 year ago

请检查在这个close调用之前,连接是否已经关闭了(调用过close?)?

https://github.com/mariadb-corporation/mariadb-connector-j/blob/2f455846f117ab9456929657f129ca44c5a5fae6/src/main/java/org/mariadb/jdbc/MariaDbConnection.java#L1024

xiezhenye commented 1 year ago

碰到了类似的问题。

try (Connection connection = dataSource.getConnection();
                Statement statement = connection.createStatement()) {
            // ...
        }

在 try 关闭 connection 的时候报错。类似这样的代码。肯定不会提前关闭连接。

使用最新的 druid 1.2.16 或者1.2.13 在某些环境必定会报错,但其他环境无法复现。不清楚差异在哪里,出错的场景用之前的 1.2.8 似乎没问题

看起来是某个版本引入的bug。我们这边用的是 oceanbase。

xiezhenye commented 1 year ago

看起来是某个版本引入的bug。我们这边底线是 oceanbase。

superchangme commented 1 month ago

请问这个问题 有进展吗 ,我们用的mariadb ,报错信息是

Error querying database. Cause: java.sql.SQLNonTransientConnectionException: (conn=69528773) Socket error