◆ 问题发现

期初在七月份时,经常发现有几个定时任务报错,查看了下异常原因,大概定位是数据库执行异常

◆ 查找原因

  • 1 和 DBA 排查 mycat(公司使用 mycat ) 和 mysql 的错误日志。发现是应用服务这边会给 MyCat 发送一个 KILL QUERY 命令,而 myCat 不支持该 KILL QUERY 命令。才给应用服务返回了 Unsupported command 异常错误

  • 2 上网搜索了下 KILL QUERY 发生的场景,在一边文章里 深入分析JDBC超时机制 找到问题所在,sql执行超时,jdbc 会向 mysql 服务发送一个kill 命令,从而停止 sql 执行,不过公司的 mycat 服务没有处理改命令,而是直接报错

  • 3 查看了下,服务的配置 这里统一配置的 mysql socket 执行超时时间是 15。而在单独的 sql 执行语句配置的设置更长是 20s(注意这里是 xml 加 注解的方式)

  • 3.1 xml里的 sql 语句我单独在客户端执行,测试的 sql 执行时间在 6,7 秒左右,是不会超过 15 这个限制的,但是从定时任务来,任务总体上就执行了 8 秒左右。说明 sql 确实是在 15内秒被超时 KILL 掉的

  • 4 想着是不是在其他配置超时。细看了下 mybatis的配置,还真有有个一个统一 sql 超时配置,default-statement-timeout = 5 的设置

  • 从文档上看,单独设置的 mybatis @Options 属性是会覆盖掉在 yml 配置的 default-statement-timeout属性的。难道是 @Options 没生效 ?

  • 5 因此决定调试一波。发现 @Options 还真的没生效,jdbc的 queryTimeout 视同 mybatis在yml的 全局配置

◆ 解决问题

  • 上面提到服务中用到 mybatis 的注解和xml混合使用。猜测应该是 mybatis 的 注解和xml 使用方式是相斥的,不兼容的,因此在 xml 的sql修改 timeout配置 timeout = 60。发现 timeout = 60 配置生效了

  • 后面将 sql 放置到 mybatis 的 @Select 注解,去掉 xml 的声明。@Options 的配置也是生效的。真的坑, mybatis 的@Options 和 xml 是无法同时生效的,可能其他的注解是一样,希望读者以后能避开这个坑

◆ 额外话:Transaction Timeout、Statement Timeout、Socket timeout 的区别

  • 上面 mybatis 配置的 timeout 其实就是Statement Timeout。还有就是在jdbc:url 配置的socketTimeout;其实还有一个事务超时 Transaction Timeout,是spring定义

◆ 它们三者的关系是在怎样的呢

◆ Statement Timeout

  • statement timeout 是用来限制statement 的执行时长,可通过调用JDBC的java.sql.Statement.setQueryTimeout(int timeout) 进行设置,不过一般是通过ORM框架来进行设置

  • 在 myBatis中,statement timeout 的默认值是通过 defaultStatementTimeout 属性进行设置。同时还可以在 xml 中 select,insert,update标签设置timeout属性,从而对不同 sql 语句配置超时时间

◆ Transaction Timeout

  • Spring 提供的 transaction timeout 配置非常简单,它会记录每个事务的开始时间和消耗时间,当超出timeout值时将抛出异常。

  • 假设某个事务中包含 3 个statement,每个statement的执行时间是 100ms,其他业务逻辑的执行时间是 50ms,那么transaction timeout至少应该设置为350ms(100 * 3 + 50)

◆ Socket timeout

  • JDBC的 socket timeout 在数据库被突然停掉或是发生网络错误时十分重要。由于TCP/IP的结构原因,socket没有办法探测到网络错误,因此应用也无法主动发现数据库连接断开。如果没有设置 socket timeout 的话,应用在数据库返回结果前会无期限地等下去,这种连接被称为 dead connection

◆ 生效顺序

  • Socket timeout 包含 Transaction Timeout,Transaction Timeout 包含 Statement Timeout。也就是说如果 Statement Timeout 大于 Transaction Timeout 或者 Socket timeout,则无法生效

  • 不推荐使用socket timeout来限制statement的执行时长,因此socket timeout的值必须要高于statement timeout,否则,socket timeout将会先生效,这样statement timeout就变得毫无意义

往期推荐

天秀!搞java的技术人写了本小说:《JavaScript百炼成仙》

55 个细节帮你全方位的完成Java 性能优化的 (珍藏)

Java 实现视频弹幕功能

Java的ClassLoader加载是怎么保证安全的?

Redis分布式锁需要考虑的这些事!

Redis 面试题!精华!收藏一波 !

解决kafka 消息堆积问题的排查及调优

MySQL 的隔离级别和事务需要知道的

3行代码能写出8个接口!同事这样做的

回复干货】获取精选干货视频教程

回复加群】加入疑难问题攻坚交流群

回复mat】获取内存溢出问题分析详细文档教程

回复赚钱】获取用java写一个能赚钱的微信机器人

回复副业】获取程序员副业攻略一份

戳这儿

Mysql数据库查询超时,这样优化快速解决问题相关推荐

  1. mysql与数据处理,[转载]Mysql数据库千万级数据处理优化

    转载:http://blog.sina.com.cn/s/blog_6dcd17320100tm6o.html 1. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by ...

  2. Mysql数据库查询好慢,除了索引,还能因为什么?

    mysql查询为什么会慢,关于这个问题,在实际开发经常会遇到,而面试中,也是个高频题. 遇到这种问题,我们一般也会想到是因为索引. 那除开索引之外,还有哪些因素会导致数据库查询变慢呢? 有哪些操作,可 ...

  3. Mysql中查询速度的优化

    2019独角兽企业重金招聘Python工程师标准>>> mysql中查询速度的优化 1.查看每一个表的数据量 2.left join的时候尽量减少表的大小,通过临时表,查询条件去限制 ...

  4. MySQL数据库查询时间段的两种方法

    MySQL数据库查询时间段的两种方法: 1. SELECT* FROMgroup_details model WHEREmodel.create_time BETWEEN TO_DAYS ( '201 ...

  5. php简单的mysql类_超简单php mysql数据库查询类

    本文章为你免费提供一款漂亮的超简单php mysql数据库查询类哦 */ class Config{ private $host;        //主机名称:一般是localhost private ...

  6. mysql数据库查询源码_超简单php mysql数据库查询类

    本文章为你免费提供一款漂亮的超简单php mysql数据库查询类哦 */ class Config{ private $host; //主机名称:一般是localhost private $root; ...

  7. MySQL分页查询方法及优化

    MySQL分页查询方法及优化 http://uusama.com/458.html

  8. 提高MySQL数据库查询效率的几个技巧(转载)

    [size=5][color=Red]提高MySQL数据库查询效率的几个技巧(转)[/color][/size]       MySQL由于它本身的小巧和操作的高效, 在数据库应用中越来越多的被采用. ...

  9. MySQL数据库查询重复数据办法

    MySQL数据库查询重复数据办法 只操作一个列数据找出重复 select * from table1 where v1 = X group by column1 having count(*)> ...

最新文章

  1. 计算机与材料成型与控制方面的应用,广东科技学院
  2. oracle 071,Oracle_071_lesson_p3
  3. 微信AI从识物到通用图像搜索的探索揭秘
  4. Exchange 2013学习(六),脱机通讯簿
  5. javascript md5加密算法
  6. Spark源码剖析(一):如何将spark源码导入到IDEA中
  7. 2754. [SCOI2012]喵星球上的点名【后缀数组】
  8. 基于角色(Role-Based)的表单验证
  9. 《信号与系统学习笔记》—周期信号的博里叶级数表示(二)
  10. 博弈论数据可用性声明_手机数据恢复,低调使用~
  11. 小米笔记本pro版bios经常找不到硬盘
  12. Microsoft Word 教程:如何在 Word 中插入图片、图标?
  13. 互动编程习作——表现随机行为及牛顿运动学
  14. Math.cbrt() Math.sqrt() Math.pow()
  15. ESXi6.5补丁更新
  16. 利用KODI轻松开启NAS分享视频方式
  17. 在水经注中导入陈江街道九条河KML文件的应用案例
  18. 什么样的触达方式,会员会喜欢?
  19. 大数据培训 | 数据仓库构建方法论和实践
  20. 我国劳动法中关于高校应届毕业生就业协议及合同的一切条款

热门文章

  1. 达梦单机到DSC集群DMHS部署
  2. 重要性采样Importance Sampling
  3. c语言编程中野指针错误,C语言(野指针错误)
  4. C语言学习记录(三)——Switch、函数定义
  5. 9.1黑马Vue电商后台管理系统商品管理模块完善:编辑商品的功能
  6. [ZJOI2016]大森林(LCT)
  7. 近视眼怎么慢慢恢复视力 近视眼怎么恢复视力自然恢复
  8. ERP系统个性化定制生产计划,简化排产流程
  9. 李昱:腾讯产品登录协议详解
  10. 包括遗传算法在内的现代优化算法简介