iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >springboot druid数据库连接池连接失败后一直重连怎么解决
  • 440
分享到

springboot druid数据库连接池连接失败后一直重连怎么解决

2023-06-30 05:06:36 440人浏览 泡泡鱼
摘要

这篇文章主要介绍了SpringBoot druid数据库连接池连接失败后一直重连怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇springboot druid数据库连接池连接失败后一

这篇文章主要介绍了SpringBoot druid数据库连接池连接失败后一直重连怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇springboot druid数据库连接池连接失败后一直重连怎么解决文章都会有所收获,下面我们一起来看看吧。

在使用个人阿里云测试机,在查询实时输出日志时,看到数据库连接失败后,服务器一直在重连服务器。开始以为是遭受重复攻击,后面把服务重启后,就没有出现一直重连的情况。看以下输出日志:

2022-02-09 11:04:58.896 ERROR 16876 --- [eate-1550991149] com.alibaba.druid.pool.DruidDataSource   : create connection sqlException, url: jdbc:mysql://47.98.67,98:1234/test?useSSL=false&characterEncoding=UTF-8&serverTimezone=UTC, errorCode 1045, state 28000

java.sql.SQLException: Access denied for user 'root'@'113.90.123.76' (using passWord: YES)
    at com.Mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) ~[mysql-connector-java-8.0.16.jar:8.0.16]
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.16.jar:8.0.16]
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-java-8.0.16.jar:8.0.16]
    at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:835) ~[mysql-connector-java-8.0.16.jar:8.0.16]
    at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:455) ~[mysql-connector-java-8.0.16.jar:8.0.16]
    at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:240) ~[mysql-connector-java-8.0.16.jar:8.0.16]
    at com.mysql.cj.jdbc.NonReGISteringDriver.connect(NonRegisteringDriver.java:199) ~[mysql-connector-java-8.0.16.jar:8.0.16]
    at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:156) ~[druid-1.1.10.jar:1.1.10]
    at com.alibaba.druid.filter.stat.StatFilter.connection_connect(StatFilter.java:218) ~[druid-1.1.10.jar:1.1.10]
    at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:150) ~[druid-1.1.10.jar:1.1.10]
    at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1560) ~[druid-1.1.10.jar:1.1.10]
    at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1623) ~[druid-1.1.10.jar:1.1.10]
    at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:2468) ~[druid-1.1.10.jar:1.1.10]

注意上面一直有 druid 数据库连接池的提示,这里就想到可能是 druid 连接池的问题,然后去掉 druid Maven 依赖后在请求接口就不会出现重连的问题。

druid 重连原因

在上图源码找到最后一行 DruidDataSource.java:2468 定位到源码上,CreateConnectionThread 创建连接线程,看一下 CreateConnectionThread 源码:

public class CreateConnectionThread extends Thread {        public CreateConnectionThread(String name){            super(name);            this.setDaemon(true);        }        public void run() {            initedLatch.countDown();            long lastDiscardCount = 0;            int errorCount = 0;            for (;;) {                // addLast                try {                    lock.lockInterruptibly();                } catch (InterruptedException e2) {                    break;                }                long discardCount = DruidDataSource.this.discardCount;                boolean discardChanged = discardCount - lastDiscardCount > 0;                lastDiscardCount = discardCount;                try {                    boolean emptyWait = true;                    if (createError != null                            && poolinGCount == 0                            && !discardChanged) {                        emptyWait = false;                    }                    if (emptyWait                            && asyncInit && createCount < initialSize) {                        emptyWait = false;                    }                    if (emptyWait) {                        // 必须存在线程等待,才创建连接                        if (poolingCount >= notEmptyWaitThreadCount //                                && !(keepAlive && activeCount + poolingCount < minIdle)) {                            empty.await();                        }                        // 防止创建超过maxActive数量的连接                        if (activeCount + poolingCount >= maxActive) {                            empty.await();                            continue;                        }                    }                } catch (InterruptedException e) {                    lastCreateError = e;                    lastErrorTimeMillis = System.currentTimeMillis();                    if (!closing) {                        LOG.error("create connection Thread Interrupted, url: " + jdbcUrl, e);                    }                    break;                } finally {                    lock.unlock();                }                PhysicalConnectionInfo connection = null;                try {                    connection = createPhysicalConnection();                    setFailContinuous(false);                } catch (SQLException e) {                    LOG.error("create connection SQLException, url: " + jdbcUrl + ", errorCode " + e.getErrorCode()                              + ", state " + e.getSQLState(), e);                    errorCount++;                    if (errorCount > connectionErrorRetryAttempts && timeBetweenConnectErrORMillis > 0) {                        // fail over retry attempts                        setFailContinuous(true);                        if (failFast) {                            lock.lock();                            try {                                notEmpty.signalAll();                            } finally {                                lock.unlock();                            }                        }                        if (breakAfterAcquireFailure) {                            break;                        }                        try {                            Thread.sleep(timeBetweenConnectErrorMillis);                        } catch (InterruptedException interruptEx) {                            break;                        }                    }                } catch (RuntimeException e) {                    LOG.error("create connection RuntimeException", e);                    setFailContinuous(true);                    continue;                } catch (Error e) {                    LOG.error("create connection Error", e);                    setFailContinuous(true);                    break;                }                if (connection == null) {                    continue;                }                boolean result = put(connection);                if (!result) {                    JdbcUtils.close(connection.getPhysicalConnection());                    LOG.info("put physical connection to pool failed.");                }                errorCount = 0; // reset errorCount            }        }    }

这是一个多线程的类,而 run 方法里面设置了没有限制的 for 循环 for (;;) {}, 而日志报错定位的信息:

connection = createPhysicalConnection();

如果符合条件 errorCount > connectionErrorRetryAttempts && timeBetweenConnectErrorMillis > 0 会再次尝试重连,先看一下这几个参数的含义:

errorCount 错误次数

在 run 方法初始化时为零,每次连接失败,会自动加1

connectionErrorRetryAttempts

连接错误重试次数,默认值为 1。

protected int  connectionErrorRetryAttempts  = 1;

timeBetweenConnectErrorMillis

连接间隔时间,单位毫秒。默认值为 500。

protected volatile long timeBetweenConnectErrorMillis = DEFAULT_TIME_BETWEEN_CONNECT_ERROR_MILLIS;public static final long DEFAULT_TIME_BETWEEN_CONNECT_ERROR_MILLIS = 500;

我们在连接数据库失败后,要不在里面 break 中断,其中有

if (breakAfterAcquireFailure) {     break;}

将改 break-after-acquire-failure 设置成 true,在 application.properties 文件如下配置:

spring.datasource.druid.break-after-acquire-failure=true

如果想多尝试连接几次,需要设置 connection-error-retry-attempts ,当 errorCount 大于 connectionErrorRetryAttempts 才会进入到 条件内,才会中断循环。在 application.properties 文件如下配置:

spring.datasource.druid.connection-error-retry-attempts=3

关于“springboot druid数据库连接池连接失败后一直重连怎么解决”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“springboot druid数据库连接池连接失败后一直重连怎么解决”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: springboot druid数据库连接池连接失败后一直重连怎么解决

本文链接: https://www.lsjlt.com/news/327535.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • springboot druid数据库连接池连接失败后一直重连怎么解决
    这篇文章主要介绍了springboot druid数据库连接池连接失败后一直重连怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇springboot druid数据库连接池连接失败后一...
    99+
    2023-06-30
  • springbootdruid数据库连接池连接失败后一直重连的解决方法
    目录druid 重连原因errorCount 错误次数总结在使用个人阿里云测试机,在查询实时输出日志时,看到数据库连接失败后,服务器一直在重连服务器。开始以为是遭受重复攻击,后面把服...
    99+
    2024-04-02
  • 数据库连接池druid参数详解
    spring: datasource: druid: # 指定数据源类型为DruidDataSource type: com.alibaba.druid.pool.DruidDataSource # 数...
    99+
    2023-09-02
    数据库 java mybatis
  • 怎么在SpringBoot中使用Druid数据库连接池
    这篇文章主要介绍怎么在SpringBoot中使用Druid数据库连接池,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Druid是阿里开源的一款数据库连接池,除了常规的连接池功能外,它还提供了强大的监控和扩展功能。这对...
    99+
    2023-06-14
  • sqlplus连接数据库失败怎么解决
    如果您无法连接到数据库,请尝试以下步骤来解决问题: 确保数据库服务正常运行:检查数据库服务是否正在运行,并且能够正常连接。 ...
    99+
    2024-04-09
    sqlplus 数据库
  • 数据库连接池(Druid(德鲁伊))
    JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤 在主程序(如servlet、beans)中建立数据库连接 进行sql操作 断开数据库连接   这种模式开发,存在的问题: 普通的JDBC数据库连...
    99+
    2023-09-14
    数据库 java sql
  • JDBC连接数据库失败怎么解决
    当JDBC连接数据库失败时,可以尝试以下解决方法:1. 检查数据库服务是否正常运行:确保数据库服务已启动,并且可以通过其他客户端工具...
    99+
    2023-09-14
    JDBC 数据库
  • mysql连接数据库失败怎么解决
    MySQL连接数据库失败可能有多种原因,以下是一些常见的解决方法: 检查MySQL服务是否启动:首先确保MySQL服务已经启动,...
    99+
    2024-03-04
    mysql 数据库
  • 详解springboot+atomikos+druid 数据库连接失效分析
    目录一、起因二、Druid数据库连接池三、Atomikos框架四、分析与总结一、起因   最近查看系统的后台日志,经常发现这样的报错信息:The last package succe...
    99+
    2024-04-02
  • 如何在SpringBoot 中使用 Druid 数据库连接池
    目录1.Maven中的pom文件2.SpringBoot 配置文件3.配置Druid数据源实例4.过滤器和Servlet5.使用@ServletComponentScan注解,6.D...
    99+
    2024-04-02
  • Springboot中怎么加入druid连接池
    本篇内容介绍了“Springboot中怎么加入druid连接池”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.DRUID连接池介绍Drui...
    99+
    2023-06-26
  • vscode连接mysql数据库失败怎么解决
    连接 MySQL 数据库失败可能由多种原因引起,以下是一些可能的解决方案: 检查 MySQL 服务是否正在运行:确保 MySQL...
    99+
    2024-04-09
    mysql vscode
  • java连接sqlserver数据库失败怎么解决
    如果Java连接SQL Server数据库失败,可以尝试以下解决方法: 检查数据库连接URL是否正确:确保URL中包含正确的主机...
    99+
    2023-10-24
    java sqlserver
  • Java 数据库连接池Druid 的介绍
    目录1、配置参数2、使用2.1、直接使用2.1.1、引入依赖2.1.2、使用例子2.2、在 SpringBoot 中使用2.1.1、引入依赖2.1.2、单数据源2.1.3、多数据源2...
    99+
    2024-04-02
  • plsql连接oracle数据库失败怎么解决
    当PL/SQL连接到Oracle数据库失败时,可以尝试以下解决方案: 检查连接字符串:确保连接字符串中包含正确的主机名、端口号、...
    99+
    2024-04-09
    plsql oracle
  • navicat连接mysql数据库失败怎么解决
    连接 MySQL 数据库失败可能有多种原因,下面是一些常见的解决方法: 确保 MySQL 服务器已经启动。在终端或命令提示符中输入...
    99+
    2024-04-09
    navicat mysql
  • idea连接mysql数据库失败怎么解决
    连接MySQL数据库失败可能是由于以下几个原因导致的: MySQL服务器未启动:确保MySQL服务器已经启动。可以在命令行中输入...
    99+
    2024-04-09
    idea mysql
  • springboot使用alibaba的druid数据库连接池错误如何解决
    本篇内容介绍了“springboot使用alibaba的druid数据库连接池错误如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!使用...
    99+
    2023-07-05
  • Druid数据库连接池如何使用
    这篇文章主要介绍了Druid数据库连接池如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Druid数据库连接池如何使用文章都会有所收获,下面我们一起来看看吧。概述数据库连接池是个容器,负责分配、管理数据库...
    99+
    2023-07-05
  • 浅谈一下数据库连接池Druid德鲁伊
    目录JDBC数据库连接池的必要性 数据库连接池技术工作原理: 数据库连接池技术的优点多种开源的数据库连接池Druid(德鲁伊)数据库连接池JDBC数据库连接池的必...
    99+
    2023-05-19
    数据库连接池 Druid 数据库连接池德鲁伊
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作