高并发下 MySQL Statement Cancellation Timer 的线程数暴涨

问题描述

在线上环境,出现高并发的场景下,MySQL Statement Cancellation Timer 的线程数比较多,接收到线上预警,分析一下原因。

下图为本地模拟环境,配置比较低,问题不突出,主要是示意一下。😏😏😏

以下是 mysql 驱动,连接池,orm 框架信息

依赖信息:

  1. mysql-jdbc 8.0.24
  2. druid 1.2.8
  3. mybatis 3.4.6

环境配置信息

  1. druid 配置,全部都是默认值
  2. mybatis 配置:
scss 复制代码
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
    SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
    factory.setVfs(SpringBootVFS.class);
    factory.setDataSource(dataSource);
    //todo 省略其他配置
    Configuration c = new Configuration();
    c.setLogImpl(StdOutImpl.class);
    c.setDefaultStatementTimeout(25000);
    factory.setConfiguration(c);

    return factory.getObject();
}

产生该线程分析

  1. 找到该线程的创建的地方 NativeSession
  1. 引用关系如下
  1. 什么时候启动 enableQueryTimeouts = true
  1. 默认值是 true
  1. startQueryTime 的调用方 StatementImpl 的 executeQuery
  1. 可以发现 timeOutInMillis 不为 0 的情况下,并且 enableQueryTimeouts = true 就会创建 CanalQueryTask 然后如果超时就会自动调度

方法调用如下: com.mysql.cj.CancelQueryTaskImpl#run

处理方案

  1. 项目使用的是使用 alibaba druid

参考:github.com/alibaba/dru...

调用的是 setQueryTimeOut 方法,然后传给 timeOutInMills

如果需要取消 CancelQueryTask 需要将 validationQueryTimeout 设置为 0

2. 并且去掉 mybatis defalutStatemnetTimeOut 参数

  1. 这些都去掉了这么来处理 mysql collection timeout
  • mysql 服务器会有一个参数 wait_timeout:mysql server 关闭连接之前,允许连接闲置多少秒。默认是 28800,单位秒,即 8 个小时。
sql 复制代码
    # 分别查看全局、会话变量值
    show global VARIABLES like '%timeout%';
    show  VARIABLES like '%timeout%';
  • druid 可以通过 testOnBorrow 和 testOnReturn、testWhileIdle分别在链接获取,链接归还的时候判断是否有效。

复现和修复

测试代码

修复效果

现象 MySQL Statement Cancellation Timer 的线程不在产生

thread dump 分析工具地址:fastthread.io/

参考资料

相关推荐
落花流水 丶20 分钟前
Spring Security 完全指南
java·spring
李慕婉学姐1 小时前
Springboot平安超市商品管理系统6sytj3w6(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
PRINT!1 小时前
RabbitMQ实战项目(含代码仓库地址+视频教程地址)基本篇已更新完结,高级篇持续更新中
java·分布式·后端·微服务·rabbitmq
gAlAxy...1 小时前
MyBatis-Plus 核心 CRUD 操作全解析:BaseMapper 与通用 Service 实战
java·开发语言·mybatis
开开心心就好1 小时前
一键加密隐藏视频,专属格式播放工具
java·linux·开发语言·网络·人工智能·macos
Amarantine、沐风倩✨2 小时前
列表接口严禁嵌套 LISTAGG + REGEXP:一次 mission_label 性能事故复盘
java·数据库·sql
m***06682 小时前
Java进阶(ElasticSearch的安装与使用)
java·elasticsearch·jenkins
小心草里有鬼2 小时前
VMware虚拟机扩容
linux·后端·centos·vim
PD我是你的真爱粉2 小时前
MySQL基础-DQL语句与多表查询
数据库·mysql
Anastasiozzzz2 小时前
Java异步编程:CompletableFuture从入门到底层实现
java·开发语言