• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

记一次数据库查询超时优化问题

开发技术 开发技术 3小时前 2次浏览

问题发现

  • 期初在七月份时,经常发现有几个定时任务报错,查看了下异常原因,大概定位是数据库执行异常
### Error querying database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Unsupported command
### The error may exist in class path resource [mapper/XXXXXXXXX-Mapper.xml]
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: select t3.cino, t2.sn as orderSn,             t2.provider_id as providerId,             t4.logistics_no as logisticsSn,             t2.`name`,      
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Unsupported command
; Unsupported command; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Unsupported command
org.springframework.dao.DataAccessResourceFailureException: 
### Error querying database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Unsupported command
### The error may exist in class path resource [mapper/XXXXXXXXXOMapper.xml]
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: select t3.cino, t2.sn as orderSn,             t2.provider_id as providerId,             t4.logistics_no as logisticsSn,         
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Unsupported command

查找原因

  • 1 和 DBA 排查 mycat(公司使用 mycat ) 和 mysql 的错误日志。发现是应用服务这边会给 MyCat 发送一个 KILL QUERY 命令,而 myCat 不支持该 KILL QUERY 命令。才给应用服务返回了 Unsupported command 异常错误
2021-07-02 10:46:33.567  WARN [$_NIOREACTOR-37-RW] (io.mycat.server.ServerQueryHandler.query(ServerQueryHandler.java:96)) - Unsupported command:KILL QUERY 2956587
  • 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的 全局配置
    记一次数据库查询超时优化问题举报


    程序员灯塔
    转载请注明原文链接:记一次数据库查询超时优化问题
    喜欢 (0)