数据库主从切换过程中Druid没法获取连接错误

背景:

今天dba在进行DB的主从切换,导致应用一直报错,获取不到DB连接,druid的错误信息如下:

Could not open JDBC Connection for transaction; nested exception is com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 15000, active 20

可以看到活跃连接数active=20, 而应用配置中设置的maxActive=100,远远没有达到最大的连接数,为什么就创建不了连接呢?

查找真相

查看和db连接有关的错误日志,发现如下

ERROR com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread (DruidDataSource.java:1713) - create connection holder error
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet successfully received from the server was 0 milliseconds ago. 

错误信息展示CreateConnectionThread 创建连接线程报错,那问题就变成了猜测连接线程已经被中止了,导致没法创建连接,使用jstack命令导出应用线程,发现确实CreateConnectionThread 线程确实不存在了,所以问题已经明朗,是因为CreateConnectionThread 线程中止了,导致再也无法创建连接。

对CreateConnectionThread 线程的代码进行检查:

public void run() {initedLatch.countDown();int errorCount = 0;for (;;) {// addLasttry {lock.lockInterruptibly();} catch (InterruptedException e2) {break;}try {// 必须存在线程等待,才创建连接if (poolingCount >= notEmptyWaitThreadCount) {empty.await();}// 防止创建超过maxActive数量的连接if (activeCount + poolingCount >= maxActive) {empty.await();continue;}} catch (InterruptedException e) {lastCreateError = e;lastErrorTimeMillis = System.currentTimeMillis();break;} finally {lock.unlock();}Connection connection = null;try {connection = createPhysicalConnection();} catch (SQLException e) {LOG.error("create connection error", e);errorCount++;if (errorCount > connectionErrorRetryAttempts && timeBetweenConnectErrorMillis > 0) {if (breakAfterAcquireFailure) {break;}try {Thread.sleep(timeBetweenConnectErrorMillis);} catch (InterruptedException interruptEx) {break;}}} catch (RuntimeException e) {LOG.error("create connection error", e);continue;} catch (Error e) {LOG.error("create connection error", e);break;}if (connection == null) {continue;}DruidConnectionHolder holder = null;try {holder = new DruidConnectionHolder(DruidDataSource.this, connection);} catch (SQLException ex) {// 主从切换过程中,这里有报错,导致线程中止LOG.error("create connection holder error", ex);break;}lock.lock();try {connections[poolingCount++] = holder;if (poolingCount > poolingPeak) {poolingPeak = poolingCount;poolingPeakTime = System.currentTimeMillis();}errorCount = 0; // reset errorCountnotEmpty.signal();notEmptySignalCount++;} finally {lock.unlock();}}}
}

我使用的版本是druid 1.7,升级到最新的1.15版本后,这个bug已经没有解决了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/109074.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于主动移频法与AFD孤岛检测的单相并网逆变器matlab仿真

微❤关注“电气仔推送”获得资料(专享优惠) 仿真模型 算法介绍 (1)仿真模型由单相电网、逆变器、滤波环节、PI控制器、PWM生成器、锁相环、AFD控制器s函数、测量模块等构成; (2)采用主动移频法(AFD)进行孤岛检测; (3)相应速度…

CMake教程-第 7 步:添加系统自省功能

CMake教程-第 7 步:添加系统自省功能 1 CMake教程介绍2 学习步骤Step 1: A Basic Starting PointStep 2: Adding a LibraryStep 3: Adding Usage Requirements for a LibraryStep 4: Adding Generator ExpressionsStep 5: Installing and TestingStep 6: Adding Sup…

基于springboot实现汉服文化分享平台项目【项目源码+论文说明】

摘要 本论文主要论述了如何使用JAVA语言开发一个汉服文化平台网站 ,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述汉服文化平台网站的当前背景以及系统开发的…

【Linux常用命令12】搜索命令及特殊字符的使用

which:查看可执行文件的位置 which 命令whereis:查看文件的位置,只能用于程序名的搜索 whereis [选项] 命令 -b 定位可执行文件。 -m 定位帮助文件。 -s 定位源代码文件。 -u 搜索默认路径下除可执行文件、源代码文件、帮助文件以外…

Python 中的省略号对象

作为一名经验丰富的 Python 开发人员,您可能遇到过 Python 中的三个点…省略号对象。 如果您尝试在 Python 解释器中打印此内容,它将显示一个省略号。 本篇文章将介绍 Python 中省略号对象的使用。 使用省略号作为未编写代码的占位符 省略号对象可以以…

【vue2高德地图api】02-npm引入插件,在页面中展示效果

系列文章目录 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、安装高德地图二、在main.js中配置需要配置2个key值以及1个密钥 三、在页面中使用3.1 新建路由3.2新建vue页面3.2-1 index.vue3.2…

基于RuoYi-Flowable-Plus的若依ruoyi-nbcio支持自定义业务表单流程的集成方法与步骤(一)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 由于大家最自定义业务表单的整个集成方法还不熟悉,下面大概介绍一下这个流程与方法。 1、首先…

2.2 如何使用FlinkSQL读取写入到文件系统(HDFS\Local\Hive)

目录 1、文件系统 SQL 连接器 2、如何指定文件系统类型 3、如何指定文件格式 4、读取文件系统 4.1 开启 目录监控 4.2 可用的 Metadata 5、写出文件系统 5.1 创建分区表 5.2 滚动策略、文件合并、分区提交 5.3 指定 Sink Parallelism 6、示例_通过FlinkSQL读取kafk…

【MySQL】索引介绍、索引的数据结构

🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 Redis 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 索引 一、索引概述二、索引结构2.1 BTree2.…

【论文阅读】 Cola-Dif; An explainable task-specific synthesis network

文章目录 CoLa-Diff: Conditional Latent Diffusion Model for Multi-modal MRI SynthesisAn Explainable Deep Framework: Towards Task-Specific Fusion for Multi-to-One MRI Synthesis CoLa-Diff: Conditional Latent Diffusion Model for Multi-modal MRI Synthesis 论文…

使用vscode + vite + vue3+ element3 搭建vue3脚手架

技术栈 开发工具:VSCode 代码管理:Git 前端框架:Vue3 构建工具:Vite 路由:vue-router 状态管理:vuex AJAX:axios UI库:element-ui 3 数据模拟:mockjs css预处理&#xf…

【c++】跟werbtc学容器:unordered_set

1 std::unordered_set 元素无特定顺序的hash容器 D:\XTRANS\m98_rtc\ndrtc-webrtc\src\third_party\protobuf\src\google\protobuf\descriptor.cc#define HASH_MAP std::unordered_map #define HASH_SET std::unordered_set #define HASH_FXN

机器学习方法之k近邻方法的综述

机器学习方法之k近邻方法的综述 前言k近邻方法的相关综述最近邻方法k近邻方法加权k近邻方法kknn程序包的介绍前言 本篇博客的目的是想用最简单的话讲清楚k近邻方法,欢迎大家在评论区提出你们的看法,你们的批评是我前进的动力。 k近邻方法的相关综述 在统计识别领域k近邻方法…

手机爬虫用Appium详细教程:利用Python控制移动App进行自动化抓取数据

Appium是一个强大的跨平台工具,它可以让你使用Python来控制移动App进行自动化操作,从而实现数据的抓取和处理。今天,我将与大家分享一份关于使用Appium进行手机爬虫的详细教程,让我们一起来探索Appium的功能和操作,为手…

SQL实现自定义排序

业务事实上,经常会遇到排序问题,对数值类型字段排序不会有很大争议,但是有时希望对字符型字段按要求进行排序。本文记录自定义排序的几种方法。 使用case when关键字进行限定 本方法思路是将希望排序小的字符取值为较小的数字。注意end后面…

Three.js图案溶解shader

上图提供两种方式溶解显示 上面一排是根据现实的图案红色通道也就是r值进行溶解 下面一排提供额外的溶解纹理 可以通过简单更改呈现多种溶解图案 代码仓库 gitee b站账号:https://space.bilibili.com/374230437 interface IMapPath {map: string;dissolve?: string…

【C/C++】静态库和动态库命名规范及最佳实践

在软件开发中,静态库和动态库是常用的代码复用形式。为了保持良好的代码组织和可维护性,以及遵循统一的命名规范是非常重要的。本文将介绍静态库和动态库的命名规范,并提供一些最佳实践,以帮助开发人员在项目中正确命名库文件。 …

3-k8s-镜像仓库harbor搭建

文章目录 一、概念二、安装harbor三、使用harbor仓库 一、概念 官方概念:Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器。 我们平时拉去镜像都是从线上仓库拉去,但是企业内部的镜像一般都不会随意传到网上,而是保存在自己公…

flutter开发实战-防抖Debounce与节流Throttler实现

flutter开发实战-防抖Debounce与节流Throttler实现 在开发中,经常遇到某些按钮或者界面操作需要做防抖或者节流操作。这里记录一下实现。 一、防抖Debounce与节流Throttler 防抖Debounce 当有可能在短时间内对一个方法进行多次调用时,需要防抖&#…

GO 工程下载依赖操作流程(go mod)

1. 写一个main.go文件 package main import ("fmt""net/http""github.com/ClickHouse/clickhouse-go" ) func main() {fmt.Println("服务启动......")http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Requ…