成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

記一次數據庫查詢超時優化問題

存儲 存儲軟件
在 myBatis中,statement timeout 的默認值是通過 defaultStatementTimeout 屬性進行設置。同時還可以在 xml 中 select,insert,update標簽設置timeout屬性,從而對不同 sql 語句配置超時時間。

[[428834]]

本文轉載自微信公眾號「潛行前行」,作者cscw 。轉載本文請聯系潛行前行眾號。

問題發現

  • 在七月份時,經常發現有幾個定時任務報錯,查看了下異常原因,大概定位是數據庫執行異常。
  1. ### Error querying database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Unsupported command 
  2. ### The error may exist in class path resource [mapper/XXXXXXXXX-Mapper.xml] 
  3. ### The error may involve defaultParameterMap 
  4. ### The error occurred while setting parameters 
  5. ### SQL: select t3.cino, t2.sn as orderSn,             t2.provider_id as providerId,             t4.logistics_no as logisticsSn,             t2.`name`,       
  6. ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Unsupported command 
  7. ; Unsupported command; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Unsupported command 
  8. org.springframework.dao.DataAccessResourceFailureException:  
  9. ### Error querying database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Unsupported command 
  10. ### The error may exist in class path resource [mapper/XXXXXXXXXOMapper.xml] 
  11. ### The error may involve defaultParameterMap 
  12. ### The error occurred while setting parameters 
  13. ### SQL: select t3.cino, t2.sn as orderSn,             t2.provider_id as providerId,             t4.logistics_no as logisticsSn,          
  14. ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Unsupported command 

排查原因

  • 1 和 DBA 排查 mycat(公司使用 mycat ) 和 mysql 的錯誤日志。發現是應用服務這邊會給 MyCat 發送一個 KILL QUERY 命令,而 myCat 不支持該 KILL QUERY 命令。才給應用服務返回了 Unsupported command 異常錯誤
  1. 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 命令,從而讓 mysql 停止 sql 執行。不過傳給了 mycat 服務,mycat 沒有處理該命令,而是直接報錯返回
  • 3 查看了下應用服務的配置,在 jdbc:url 統一配置的 mysql socket 執行超時時間是 15s。而在 mybatis 單獨的 sql 執行語句配置的設置更長,是 20s(注意這里的配置是 xml 加 注解的方式)
  • 3.1 mybatis xml里的 sql 語句我單獨在客戶端執行,測試的 sql 執行時間大概在 6,7 秒左右,是不會超過 15s 這個限制的,但是從定時任務調度日志看,每次任務總體上就執行了 8 秒左右,說明 mycat 確實是在15秒內收到超時 KILL 命令,從而導致sql 執行失敗

  • 4 想著是不是在其他地方配置超時。細看了下 mybatis 的配置,還真有一個統一 sql 超時配置,default-statement-timeout = 5
  • 從mybatis 源碼文檔上看,單獨設置的 mybatis @Options timeout屬性是會覆蓋掉在 yml 配置的 default-statement-timeout屬性的。難道是 @Options 沒生效 ?

5 因此決定本地調試一波。發現 @Options 還真的沒生效,jdbc的 queryTimeout 取值的是 mybatis在yml的 全局配置

解決問題

  • 上面提到, sql 的 statment 混合使用了 mybatis 的注解和xml混合使用。猜測應該是 mybatis 的 注解和xml 使用方式是不兼容的。因此試著在 xml 的 statment 修改了 timeout配置。設置 timeout = 60。發現 配置生效了,如下圖圖片:

后面也試著將 sql 放置到 mybatis 的 @Select 注解,去掉 xml 的 statement。@Options 的配置也是可以生效的。mybatis 的@Options 和 xml 是無法同時生效的,可能 mybatis 其他的注解一樣和 xml 配置不能同時生效,希望讀者以后能避開這個坑。

Transaction Timeout、Statement Timeout、Socket timeout 的區別

  • 上面 mybatis 配置的 timeout 其實就是Statement Timeout。還有就是在jdbc:url 配置的socketTimeout;其實還有是spring定義的一個事務超時:Transaction Timeout。

它們三者的關系是在怎樣的呢

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就變得毫無意義

參考文章

深入分析JDBC超時機制 

如何配置MySQL數據庫超時設置

 

責任編輯:武曉燕 來源: 潛行前行
相關推薦

2019-08-19 01:34:38

數據庫SQL數據庫優化

2019-12-02 08:09:57

境數據庫連接超時自動回收

2023-11-29 12:12:24

Oceanbase數據庫

2019-09-27 17:24:26

數據庫優化sql

2018-07-11 10:24:33

數據恢復數據刪除

2020-02-10 10:15:31

技術研發指標

2011-08-08 13:31:44

數據分析數據倉庫

2018-12-06 16:25:39

數據庫服務器線程池

2020-08-24 07:34:39

網絡超時請求

2023-04-06 07:53:56

Redis連接問題K8s

2018-02-23 13:41:05

數據庫MySQL數據恢復

2011-02-22 09:29:23

jQueryJavaScript

2021-01-08 13:52:15

Consul微服務服務注冊中心

2019-11-22 08:05:01

數據庫mysql分區

2019-11-18 13:42:55

MySQL數據庫遷移

2019-09-11 08:22:57

MySQL數據庫遠程登錄

2021-05-13 08:51:20

GC問題排查

2019-12-16 07:18:42

數據庫SQL代碼

2019-04-04 15:00:40

SQL索引數據庫

2019-11-28 08:31:21

Oracle數據庫索引
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一级大黄 | 丁香婷婷在线视频 | 在线观看中文字幕 | 逼逼网 | 亚洲有码转帖 | 97国产精品 | 国产精品久久国产精品 | 男人的天堂在线视频 | 香蕉视频91 | 国产成人自拍av | 欧美午夜一区二区三区免费大片 | 最新黄色在线观看 | 黄免费看| 国产精品无码专区在线观看 | 国产婷婷综合 | 国产精品不卡一区 | 久久不卡 | av免费在线观看网站 | 亚洲欧美一区二区三区国产精品 | 亚洲精品久 | 91av入口 | 国产美女在线播放 | 亚洲综合色视频在线观看 | 亚洲国产精品日韩av不卡在线 | 亚洲精品成人 | 精品美女视频在线观看免费软件 | 国产激情视频在线观看 | 久久久久亚洲精品中文字幕 | 国产在线拍偷自揄拍视频 | 日韩视频免费在线 | 久久久久无码国产精品一区 | 99久久精品国产麻豆演员表 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 羞羞视频网站免费观看 | 高清国产午夜精品久久久久久 | 91精品国产一区二区 | 91大神在线资源观看无广告 | 91久久久久久久久 | 中文一区二区视频 | 人妖无码| 天天干狠狠操 |