问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2024-10-02 11:49

我来回答

1个回答

热心网友 时间:2024-12-08 16:00

问题发现

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

###Errorqueryingdatabase.Cause:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:Unsupportedcommand###Theerrormayexistinclasspathresource[mapper/XXXXXXXXX-Mapper.xml]###TheerrormayinvolvedefaultParameterMap###Theerroroccurredwhilesettingparameters###SQL:selectt3.cino,t2.snasorderSn,t2.provider_idasproviderId,t4.logistics_noaslogisticsSn,t2.`name`,###Cause:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:Unsupportedcommand;Unsupportedcommand;nestedexceptioniscom.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:Unsupportedcommandorg.springframework..DataAccessResourceFailureException:###Errorqueryingdatabase.Cause:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:Unsupportedcommand###Theerrormayexistinclasspathresource[mapper/XXXXXXXXXOMapper.xml]###TheerrormayinvolvedefaultParameterMap###Theerroroccurredwhilesettingparameters###SQL:selectt3.cino,t2.snasorderSn,t2.provider_idasproviderId,t4.logistics_noaslogisticsSn,###Cause:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:Unsupportedcommand查找原因

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

2021-07-0210:46:33.567WARN[$_NIOREACTOR-37-RW](io.mycat.server.ServerQueryHandler.query(ServerQueryHandler.java:96))-Unsupportedcommand:KILLQUERY2956587

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

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

3.1xml里的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是无法同时生效的,可能mybatis其他的注解一样和xml配置不能同时生效,希望读者以后能避开这个坑

额外话:TransactionTimeout、StatementTimeout、Sockettimeout的区别

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

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

statementtimeout是用来*statement的执行时长,可通过调用JDBC的java.sql.Statement.setQueryTimeout(inttimeout)进行设置,不过一般是通过ORM框架来进行设置

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

TransactionTimeout

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

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

Sockettimeout

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

生效顺序

Sockettimeout级别优于TransactionTimeout,TransactionTimeout级别优于StatementTimeout。也就是说如果StatementTimeout大于TransactionTimeout或者Sockettimeout,则无法生效

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

参数文章

深入分析JDBC超时机制

如何配置MySQL数据库超时设置

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
先奇XQ-23投影仪-高清画质 商务教学必备 XIANQI 先奇 XQ-68 家用投影机 语音版 白色-超高清4K解码,AI智能语音... 先奇XQ-17投影机-高清投影体验 先奇XQ-17办公投影机-高清投影轻松投屏 XIANQI 先奇 XQ-17 办公投影机 银色 语音版-详细介绍 办公投影仪推荐-XIANQI先奇XQ-23标配版 bootcamp安装win7修复-(bootcamp 安装win7) win7装机鼠标不能用 苹果电脑装win7系统鼠标不动苹果电脑win7系统鼠标不能用 QQ免费主题设置方法 115网盘如何获得下载配额? 我下了个孤岛危机弹头,可一打开游戏,但是读取到99的时候就弹回桌面,下 ... ...的是,也没有,是不是显卡坏了,昨天下了《孤岛危机2》把显卡 体验了下用集成显卡玩孤岛危机,真是卡啊!!!不如8600GT 我家显卡是集成的,可不可以玩孤岛危机1?听别人说集成显卡玩这个游戏会被... 电动车钥匙门打开一点反应没有,但是动一下大闸就好使了,是怎么回事? ...充电状态显示已满,钥匙开起无任何反应,接上充电器一切正常,怎么回事... 为什么我下的命令与征服3泰伯利亚战争一打开就个图片等了1个小时都进... ...没反应,接上充电器整车有电但显示已经充满,打开车灯... 马丁靴怎么配衣服 谁穿谁好看 有哪些萝莉系女演员? 2015马会生活幽默120 蒙自有哪些地方招工 深圳哪些地方招工 关于博时基金转换的问题(博时三产转换成博时精选的费用是多少)_百度... 博时三产6月18曰净值多少 主机不通电什么情况? 什么叫金本位? 实用外贸服装英语目录 金本位制的典型特征有哪些? ...小题1:图例①、②、③代表的自然带分别是 A.亚热带常绿硬_百度... 某旅游者在某岛国旅行(图1),在甲点拍摄到10米外的风景照片(图2).据... ...前者对应两种自然带,后者对应两种气候类型的是( )A.热带雨林气候_百... 主要的单点登录协议不包括 IAM单点登录之CAS协议分析 农行小额借贷需要什么条件 s-o-r托尔曼 ...主义心理学对学习的观点可用公式表示为“S—O—R”,是否正确?_百度... 狗狗摔倒头的死前症状 狗狗摔到头死前会有什么症状? 狗狗被摔了危险期是几天 摔到头怎么确定没事 狗狗摔倒头休克的症状 小狗摔到头怎么确认没事 脑震荡能自愈吗 送股上市日送红股与派现金的区别 ...有凹凸.医生说不用动手术 会鉴定成轻伤还是轻微伤 ...屁股上有一点骨裂,医生说不用住院,算是轻伤还是轻微伤? 殴打他人致脱臼 过了5天说要动手术 怎么办 说我能够成故意伤害罪 谢谢... ...具体有财务管理,市场营销,企业管理,投资与理财还有国际金融与贸易... 投资与理财专业和市场营销物流管理哪个好点 会计 酒店管理 市场营销 计算机 电子商务 投资与理财 选哪个好?