简单的生产数据库重连策略优化

news2025/1/6 10:03:29

简单的druid生产数据库重连策略优化

1. 需求

我们生产环境有一次在大量请求拥堵后,好多数据库操作都超时了,在此之后数据库的连接池不能正常的获取数据库连接了,我们确认了数据库服务是没有问题的,那么就是连接池的配置有问题,所以需要优化连接池的配置信息,我们使用的是druid连接池,优化后服务便不会出现之前连接池获取不到连接情况,此处记录一下方便后续使用方便。

2. 具体优化配置

2.1 修改内容

我们的数据源是多数据源,从配置文件中读取,使用java代码实现,此处就不多赘述了,此处主要修改的breakAfterAcquireFailure这个参数。druidDataSource.setBreakAfterAcquireFailure(boolean flag)其具体参数作用如下所示:

  • 当设置为 true 时,如果获取连接失败(例如数据库服务不可用),Druid 连接池将进入“断开”状态。一旦进入该状态,后续的连接请求都会立即失败,直到连接池被重置或重启。

  • 当设置为 false 时,即使获取连接失败,连接池也不会进入“断开”状态,而是会继续尝试获取新的连接。

我们还添加了testOnBorrow参数设置,其具体作用如下:

  • 当设置为 true 时,在从连接池中借用连接之前,会先测试连接的有效性。如果连接无效,则会从连接池中移除并尝试获取新的有效连接。
  • 这种配置可以确保每次获取到的连接都是有效的,避免了使用失效连接导致的问题。

2.2 修改前后对比

修改前配置:setBreakAfterAcquireFailure(true):

  • 优点: 在某些情况下可以快速失败,避免浪费资源在无效的连接尝试上。
  • 缺点: 一旦连接池进入“断开”状态,除非手动重置或重启,否则无法恢复。这会导致在数据库服务短暂不可用后,应用无法自动恢复连接。

修改后配置:setBreakAfterAcquireFailure(false) + setTestOnBorrow(true):

  • 优点: 即使多次连接失败,连接池也不会进入“断开”状态,而是继续尝试获取新连接。同时,setTestOnBorrow(true) 确保每次获取到的连接都是有效的,从而提高了系统的健壮性和自愈能力。
  • 缺点: 可能会增加一些性能开销,因为每次借用连接前都需要进行有效性测试。

修改后具体代码如下:

/**
 * 动态数据源配置
 * @return DataSource 动态数据源
 */
@Primary
@Bean
public DataSource multipleDataSource() {
	// 从获取动态数据源配置信息
	List<BusinessModuleType.Module> moduleList = businessModuleType.getModules();
	DynamicDataSource dynamicDataSource = DynamicDataSource.getInstance();
	Map<Object, Object> targetDataSources = new HashMap<>(BaseCacheProperties.DEFAULT_MAP_SIZE);
	moduleList.forEach(module -> {
		DruidDataSource moduleDataSource = new DruidDataSource();
		// 设置密码用户错误重连次数
		moduleDataSource.setConnectionErrorRetryAttempts(BaseCacheProperties.ERROR_RETRY_ATTEMPTS);
		// 数据库连接池连接失败重连配置
		moduleDataSource.setBreakAfterAcquireFailure(false);
		moduleDataSource.setTestOnBorrow(true);
		moduleDataSource.setDriverClassName(module.getClassName());
		moduleDataSource.setUrl(module.getUrl());
		moduleDataSource.setUsername(module.getUsername());
		moduleDataSource.setPassword(module.getPassword());
		moduleDataSource.setInitialSize(module.getInitialSize());
		moduleDataSource.setMinIdle(module.getMinSize());
		moduleDataSource.setMaxActive(module.getMaxSize());
		moduleDataSource.setMaxWait(module.getWaitTime());
		moduleDataSource.setTimeBetweenEvictionRunsMillis(module.getTimeBetweenEvictionRunsMillis());
		moduleDataSource.setMinEvictableIdleTimeMillis(module.getMinEvictableIdleTimeMillis());
		moduleDataSource.setValidationQuery(module.getValidation());
		if (BaseCacheProperties.DEFAULT_FLAG.equals(module.getName())) {
			targetDataSources.put(module.getDb(), dataSource);
		} else {
			targetDataSources.put(module.getDb(), moduleDataSource);
		}
	});
	dynamicDataSource.setTargetDataSources(targetDataSources);
	dynamicDataSource.setDefaultTargetDataSource(dataSource);
	return dynamicDataSource;
}

2.3 总结

改后的配置 (setBreakAfterAcquireFailure(false) 和 setTestOnBorrow(true)) 更加健壮,能够在数据库服务短暂不可用后自动恢复连接,而不会导致连接池进入“断开”状态。这种配置适合大多数生产环境,因为它提供了更好的容错能力和自愈能力。

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

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

相关文章

Servlet解析

概念 Servlet是运行在服务端的小程序&#xff08;Server Applet)&#xff0c;可以处理客户端的请求并返回响应&#xff0c;主要用于构建动态的Web应用&#xff0c;是SpringMVC的基础。 生命周期 加载和初始化 默认在客户端第一次请求加载到容器中&#xff0c;通过反射实例化…

游戏如何检测iOS越狱

不同于安卓的开源生态&#xff0c;iOS一直秉承着安全性更高的闭源生态&#xff0c;系统中的硬件、软件和服务会经过严格审核和测试&#xff0c;来保障安全性与稳定性。 据FairGurd观察&#xff0c;虽然iOS系统具备一定的安全性&#xff0c;但并非没有漏洞&#xff0c;如市面上…

android studio android sdk下载地址

android studio安装后&#xff0c;因为公司网络原因&#xff0c;一直无法安装android sdk 后经过手机网络&#xff0c;安装android sdk成功如下&#xff0c;也可以手动下载后指定android sdk本地目录 https://dl.google.com/android/repository/source-35_r01.zip https://dl…

Redis面试相关

Redis开篇 使用场景 缓存 缓存穿透 解决方法一&#xff1a; 方法二&#xff1a; 通过多次hash来获取对应的值。 小结 缓存击穿 缓存雪崩 打油诗 双写一致性 两种不同的要求 强一致 读锁代码 写锁代码 强一致&#xff0c;性能低。 延迟一致 方案一&#xff1a;消息队列 方…

gitlab的搭建及使用

1、环境准备 服务器准备 CentOS Linux release 7.9.2009 (Core)&#xff0c;内存至少4G。 修改主机名和配置ip地址 hostnamectl set-hostname <hostname> 关闭主机的防火墙 # 关闭防火墙 systemctl stop firewalld #临时关闭防火墙 systemctl disable firewalld …

趣味编程:心形曲线

目录 1.序言 2.代码展示 3.代码详解 3.1 头文件包含 3.2 绘制坐标轴函数 3.3 main 函数主体部分 4. 小结 1.序言 2025年的第一篇博客就用这个笛卡尔心形图开篇吧&#xff0c;寓意着新年大家能够有心有所属&#xff0c;祝诸位程序猿 / 程序媛 能够早点遇到自己的另一半。…

跳跃表(跳表)是什么

为什么要有跳表 正常链表只能一个一个往下走但是如果我直到我的目标位置就在链表的中部但是我还得一步一步走过去很浪费时间&#xff0c;所以跳表就是在正常链表的基础上添加了多步跳跃的指针。 什么是跳表 跳表&#xff08;Skip List&#xff09;是一种概率型的数据结构&am…

如何逐步操作vCenter修改DNS服务器?

在vSphere 7中有一个新功能&#xff0c;它允许管理员更改vCenter Server Appliance的FQDN和IP。因此本文将介绍如何轻松让vCenter修改DNS服务器。 vCenter修改DNS以及修改vCenter IP地址 与在部署 vCenter Server Appliance 后&#xff0c;您可以根据需要修改其 DNS 设置和 IP…

支持图片生成、语音转文本和文本转语音节点,支持导出和导入应用,MaxKB知识库问答系统v1.9版本发布

2025年1月3日&#xff0c;MaxKB开源知识库问答系统正式发布v1.9版本。 在v1.9社区版中&#xff0c;应用方面&#xff0c;MaxKB新增图片生成节点、文本转语音节点、语音转文本节点&#xff0c;支持用户提问时上传音频文件&#xff0c;支持导出和导入应用&#xff1b;知识库方面…

WebGL 实践(一)开发环境搭建

WebGL 是一种基于 JavaScript 的 API&#xff0c;用于在浏览器中渲染 2D和3D 图形&#xff0c;很多场景都能用&#xff0c;例如游戏开发、数据可视化、在线教育和虚拟现实等应用领域。 零、基础知识 相关基础知识很重要&#xff0c;如果会html、JavaScript等技术掌握起来会更…

商米电子秤服务插件

概述 SunmiScaleUTS封装商米电子秤服务模块&#xff0c;支持商米旗下S2, S2CC, S2L CC等设备&#xff0c;设备应用于超市、菜市场、水果店等,用于测量商品的重量,帮助实现快捷、准确、公正的交易等一系列商业场景。 功能说明 SDK插件下载 一. 电子秤参数 型号:S2, S2CC, …

【开源监控工具】Uptime Kuma:几分钟设置实时监控你的网站性能

文章目录 前言1.关于Uptime Kuma2.安装Docker3.本地部署Uptime Kuma4.使用Uptime Kuma5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定Uptime Kuma公网地址 前言 大家好&#xff01;如果你是网站运维人员或者管理着多个站点&#xff0c;那么今天我要介绍的一款工具绝对…

ubuntu操作系统安装SSH服务

1、更新仓库 sudo apt-get update 2、安装SSH服务 #安装SSH服务 apt-get install openssh-server#启用SSH服务 service ssh start#查看SSH服务运行状态 service ssh status 3、修改SSH配置文件 sudo vi /etc/ssh/sshd_config 4、开启ssh端口 sudo ufw allow ssh 5、重启SSH…

二、github基础

Github基础 备用github.com网站一、用户界面-Overview&#xff08;概览&#xff09;1用户信息2 导航栏3 热门仓库4 贡献设置5贡献活动6搜索和筛选7自定义收藏8贡献统计9最近活动10其他链接 二、用户界面-Repositories&#xff08;仓库&#xff09;1 libusb_stm322 savedata3 Fi…

Flink源码解析之:如何根据JobGraph生成ExecutionGraph

Flink源码解析之&#xff1a;如何根据JobGraph生成ExecutionGraph 在上一篇Flink源码解析中&#xff0c;我们介绍了Flink如何根据StreamGraph生成JobGraph的流程&#xff0c;并着重分析了其算子链的合并过程和JobGraph的构造流程。 对于StreamGraph和JobGraph的生成来说&…

mysqll连接用时太长解决方法

1、连接用时太长分析 从客户端连接mysql服务器&#xff0c;时间长达10几秒&#xff0c;此为mysql的dns的反向解析造成&#xff0c;在局域网内如果都是用ip连接&#xff0c;可以通过在配置文件中添加skip-name-resolve&#xff0c;取消此功能&#xff0c;取消后&#xff0c;就不…

LLM(十二)| DeepSeek-V3 技术报告深度解读——开源模型的巅峰之作

近年来&#xff0c;大型语言模型&#xff08;LLMs&#xff09;的发展突飞猛进&#xff0c;逐步缩小了与通用人工智能&#xff08;AGI&#xff09;的差距。DeepSeek-AI 团队最新发布的 DeepSeek-V3&#xff0c;作为一款强大的混合专家模型&#xff08;Mixture-of-Experts, MoE&a…

办公 三之 Excel 数据限定录入与格式变换

开始-----条件格式------管理规则 IF($A4"永久",1,0) //如果A4包含永久&#xff0c;条件格式如下&#xff1a; OR($D5<60,$E5<60,$F5<60) 求取任意科目不及格数据 AND($D5<60,$E5<60,$F5<60) 若所有科目都不及格 显示为红色 IF($H4<EDATE…

【深度学习】多目标融合算法—样本Loss提权

目录 一、引言 二、样本Loss提权 2.1 技术原理 2.2 技术优缺点 三、总结 一、引言 在朴素的深度学习ctr预估模型中&#xff08;如DNN&#xff09;&#xff0c;通常以一个行为为预估目标&#xff0c;比如通过ctr预估点击率。但实际推荐系统业务场景中&#xff0c;更多是多…

mapbox进阶,添加路径规划控件

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️MapboxDirections 控件二、🍀添加路径规划控件1. ☘️实现思路2. ☘️…