网站首页 > 博客文章 正文
欢迎关注我的头条号:Wooola,10年Java软件开发及架构设计经验,专注于Java、Go语言、微服务架构,致力于每天分享原创文章、快乐编码和开源技术。
前言
最近利用MHA做好Mysql读写分离后,时不时有用户反馈后台发布文章时,报程序“通用异常",经问题排查,里面涉及应用JDBC连接池参数及Mysql参数调整问题。
问题回顾
异常日志描述:
从异常信息反映来看,问题关键有两点
- 数据库连接池超时设置大于wait_timeout
- 日志提示,可以通过验证数据库连接或者设置:autoReconnect=true 来避免此异常
从以上两点可以推测
第一、应用程序数据库连接池超时参数设置有问题
第二、安装Mysql数据库时,对于Mysql的内在参数wait_timeout没有做实际场景的优化处理
问题定位
wait_timeout参数具体用途
wait_timeout具体含义是服务器关闭非交互连接之前等待活动秒数。MySQL缺省配置情况下,wait_timeout的初始值是28800秒,也就是8小时。如果wait_timeout超时时间设置过大,在MySQL管理系统里会产生大量的SLEEP进程无法及时释放,会导致服务器系统性能下降;同时该参数设置过小,会导致Mysql处理某些事务未处理,连接不可用状态。
也就是说如果在wait_timeout设置期间内,数据库连接Connection一直处于空闲等待状态,mysql内部会自动关闭此连接,而应用程序无法感知到,依然认为连接池合法持有该连接。当应用端再次用该连接来进行数据库操作时,就产生上述异常错误。
应用端Druid数据库连接池参数排查
发现连接池有个MaxWait参数设置过大:60000毫秒
druidDataSource.setMaxWait(60000)
然后在CSDN上,发现有个同行碰到同样的问题:
发现数据库等待超时时间(wait_timeout)是28800s,也就是8小时,而应用程连接池参数max-wait: 30000,所以导致项目判定该链接可用,而mysql判定该连接不可用导致连接失败。
解决办法
根据上面的分析思路,我们排查了Mysql生产库,发现默认Mysql超时时间(wait_timeout)也是28800s,但是应用层连接池MaxWait参数设置成60000,于是我把MaxWait参数设置成10000,小于Mysql超时时间(wait_timeout):28800 ,在测试环境等待8小时后,报错消失了。
其他扩展思路(来源网络)
思路一:在jdbc-url后添加 &autoReconnect=true,使用后无效,查的该方案只适用于Mysql4之前的版本有效
思路二:将mysql回收空闲连接的时间变长,mysql默认回收时间是8小时,可以在mysql目录下的my.ini中增加下面配置,将时间改为1天。单位是秒,最大好像是24天。 此配置会拖累数据库性能,随弃用该方案。
思路三:配置druid链接池,使用 validation-query test-on-borrow: true test-while-idle: true 三种属性,每次获取数据库连接时判断该连接是否可用。同时设置druidDataSource.setPhyTimeoutMillis参数
连接最大存活时间,默认是-1(不限制物理连接时间),从创建连接开始计算,如果超过该时间,则会被清理 druidDataSource.setPhyTimeoutMillis(15000);
参考例子
目前项目中趋于稳定的连接池参数优化实战,参考如下:
Druid连接池参数官方说明:
猜你喜欢
- 2024-10-03 Spring Boot 3.x 使用 Druid(spring boot druid 配置)
- 2024-10-03 springboot配置druid数据源(springboot druiddatasource)
- 2024-10-03 WEB项目开发之SpringMVC+Mybatis搭建网站框架完整版
- 2024-10-03 springboot 引入数据库,集成mybatis-Generator自动生成
- 2024-10-03 阿里巴巴数据库连接池DruidDataSource配置及其常见问题汇总
- 2024-10-03 2021 最新版 Spring Boot 速记教程
- 2024-10-03 配置 Druid 数据源及密码加密 | SpringBoot 2.7 实战基础
- 2024-10-03 绝了!Dataway让SpringBoot不在需要Controller、Service、Mapper
- 2024-10-03 Dataway让SpringBoot不在需要Controller、Service、DAO、Mapper
- 2024-10-03 spring使用技巧-如何实现动态数据源
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- ifneq (61)
- 字符串长度在线 (61)
- googlecloud (64)
- messagesource (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)