日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Mysql cancel分析

發布時間:2023/12/20 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mysql cancel分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近看了下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分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。