最近看了下mysql jdbc的cancel功能的源码,做个笔记记录下

Jdbc:mysql-connector-java-8.0.18.jar

mysql-connector源码中有个CancelQueryTask(CancelQueryTaskImpl)定时任务,CancelQueryTaskImpl继承了TimerTask同时实现了CancelQueryTask接口。

在ClientPreparedStatement.executeInternal方法里面会通过this.startQueryTimer()方法去生成这个CancelQueryTask

CancelQueryTask这个对象是用于将执行中的SQL取消掉的任务对象,当SQL执行前,通过StatementImpl.setQueryTimeout(int)(参数单位为秒)这个参数的值只要不是0,

它就会在JDBC内部与MySQL通信前会创建一个任务(当前connection新建一个CancelQueryTaskImpl对象)并设置延迟执行的时间(timeout的时间),

然后会将这个任务放入到一个Timer的任务队列中,等待触发执行。如果是0就会返回null(CancelQueryTask为null)

cancel任务:

run方法里面会新建一个SocketConnection
然后通过NativeSession.sendCommand()发送消息来做cancel的操作发送kill query命令,同时标记状态。
后面会通过localQueryToCancel.setCancelStatus(CancelStatus.CANCELED_BY_TIMEOUT);对当前TimerTask任务中的Query对象,将CancelStatus设置为TIMEOUT。

这就是一次因为timeout而做的cancel。

1.主动cancel

调用StatementImpl.cancel()方法在获取一些本地信息后会新建一个SocketConnection
然后通过NativeSession.sendCommand()发送消息来做cancel的操作发送kill query命令,同时标记状态。
后面也会通过localQueryToCancel.setCancelStatus(CancelStatus.CANCELED_BY_USER); 对当前TimerTask任务中的Query对象,将CancelStatus设置为.CANCELED_BY_USER。

2.被动cancel
当执行完execSQL以后
如果CancelQueryTask不为null,SQL语句一直未响应,CancelQueryTask在达到设置的timeout值时会被Timer调度
会执行stopQueryTimer()方法内部去调用CancelQueryTask.cancel();此时的timeoutTask.cancel()并不是真正的去执行cancel操作,

只是将state设置为了CANCELLED仅仅对状态做了标记而已,后面的purge()方法,发现状态为取消,会去真正移除该任务。

在从Timer的任务队列将CancelQueryTask任务cancel掉,然后从此Timer的任务队列中删除所有已取消的任务。

Mysql cancel分析相关推荐

  1. Mysql元数据分析

    Mysql元数据分析 一.information_schema库 information_schema库中的表,保存的是Mysql的元数据. 官网元数据表介绍 InnoDB相关的表介绍 库中有表: + ...

  2. MYSQL:explain分析

    mysql explain分析 通过explain可以知道mysql是如何处理语句,分析出查询或是表结构的性能瓶颈.通过expalin可以得到: 1. 表的读取顺序 2.表的读取操作的操作类型 3.哪 ...

  3. MySQL索引分析和优化(转)

    MySQL索引分析和优化(转) 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记 录,直至找到符 ...

  4. mysql genlog 分析_Mysq性能分析 —— Genral log(普通日志)与 Slow log(慢速日式)...

    对Mysql进行深入的分析对于发现mysql性能瓶颈和寻找优化策略是十分必要的. 我们可以从不同的粒度上对Mysql进行分析:可以整体分析服务器,或者检查单个查询或批查询. 通过分析,我们得到的如下信 ...

  5. MySQL性能分析及explain的使用

    MySQL性能分析及explain用法的知识是本文我们主要要介绍的内容,接下来就让我们通过一些实际的例子来介绍这一过程,希望能够对您有所帮助. 1.使用explain语句去查看分析结果 如explai ...

  6. MySQL 索引分析除了 EXPLAIN 还有什么方法?

    作者 | adrninistrat0r 责编 | 夕颜 出品 | CSDN(ID:CSDNnews) 前言 对于非数据库开发人员而言,难以对MySQL源码进行分析或调试,接近一个黑盒,但MySQL提供 ...

  7. (3.13)mysql基础深入——mysql日志分析工具之mysqlsla【待完善】

    (3.13)mysql基础深入--mysql 日志分析工具之mysqlsla 关键字:Mysql日志分析工具.mysqlsla 常用工具 [1]mysqldumpslow:官方提供的慢查询日志分析工具 ...

  8. MySQL 性能分析 之 联合索引(复合索引)实践分析

    MySQL 性能分析 之 联合索引(复合索引)实践分析 作为开发者,大家都知道,一个服务器.一个数据库的性能是项目的重中之重,后台架构.写法与数据库设计的好坏往往直接影响到整个项目的性能. 索引:是当 ...

  9. php mysql索引原理_加速PHP动态网站 关于MySQL索引分析优化

    本文主要讲述了如何加速动态网站的MySQL索引分析和优化. 一.什么是索引? 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第 ...

最新文章

  1. 在单元测试时指定HttpContext的各种Path
  2. 酷我音乐盒里的MV怎么下载
  3. Spring Boot (4)---配置文件详解
  4. Win-MASM64汇编语言-LEA指令
  5. C++中指针和引用区别
  6. SpringCloud学习5-如何创建一个服务提供者provider
  7. android 蓝牙与单片机通信原理图,单片机结合蓝牙模块串口通信
  8. Java开发微信小程序(三)用小程序给用户推送服务消息
  9. 图解多线程设计模式pdf_图解Java多线程设计模式pdf
  10. 置信区间的临界值_在进行区间估计时,若要求置信水平为95%,则相应的临界值为...
  11. u8、u16、u32、s8、s16、s32、Size_t是什么类型?
  12. Mysql数据库操作语句总结(一)
  13. 大学书信选3(新年心语)
  14. 渲染吃显卡还是CPU,如何高效3D渲染?
  15. 免费获得minecraft账号,快来试试!!!
  16. 女神节,CRMEB向女神致敬!官方特别设计免费ui小图标来了!
  17. 手把手教你搭建惊艳的博客
  18. 微信开放平台--》网站应用开发 微信登录网站接口(https://open.weixin.qq.com/)
  19. 网络:TCP的滑动窗口与流量控制和拥塞控制
  20. 【定时任务】Spring Boot 定时执行任务详解,每天定时几点钟执行任务

热门文章

  1. sketch制作Android动画,Sketch制作GIF动画——基础篇(改良版)
  2. spring cloud、gradle、父子项目、微服务框架搭建---搭建Eureka注册中心(一)
  3. ipad一直显示连接app服务器出错,iPad显示无法连接到App Store怎么办 打开不了解决方法...
  4. 无限循环抛出 No method found for class [B 这个异常
  5. 在几何画板中如何制作圆柱的侧面展开动画_几何画板如何制作圆柱体形成的过程动画...
  6. html tr固定行高列宽,HTML表格固定格式:行高列宽
  7. idea中搭建基于maven的ssm整合框架
  8. java 当前时间加12小时_Java设置时间的24或12小时机制
  9. Anaconda prompt 提示系统找不到指定路径
  10. 哈工大软件构造Lab2实验