Mysql cancel分析

眾合網1143561141發表於2020-12-23

最近看了下mysql jdbc的cancel功能的原始碼,做個筆記記錄下
mysql-connector-java-8.0.18.jar

Mysql有個CancelQueryTask(CancelQueryTaskImpl)定時任務器,繼承了TimerTask
在ClientPreparedStatement.executeInternal方法裡面會透過this.startQueryTimer()方法去生成這個CancelQueryTask
CancelQueryTask這個物件是用於將執行中的SQL取消掉的任務物件,當SQL執行前,透過StatementImpl.setQueryTimeout(int)(引數單位為秒)

這個引數的值只要不是0,它就會在JDBC內部與MySQL通訊前會建立一個任務(當前connection新建一個CancelQueryTaskImpl物件)並設定延遲執行的時間(timeout的時間)

cancel任務:
(run方法裡面會新建一個SocketConnection
然後NativeSession.sendCommand()傳送訊息來做cancel的操作
後面會去修改this.setCancelStatus(CancelStatus.CANCELED_BY_TIMEOUT);對狀態做了一個標記)

如果是0就會返回null(CancelQueryTask為null)

1.主動cancel
呼叫StatementImpl.cancel()方法在獲取一些本地資訊後會新建一個SocketConnection
然後NativeSession.sendCommand()傳送訊息來做cancel的操作
後面會去修改this.setCancelStatus(CancelStatus.CANCELED_BY_USER);對狀態做了一個標記

2.被動cancel
當執行完execSQL以後
如果CancelQueryTask不為null,SQL語句一直未響應,CancelQueryTask在達到設定的timeout值時會被Timer排程
會執行this.stopQueryTimer()方法內部去呼叫CancelQueryTask.cancel();
在從Timer的任務佇列將CancelQueryTask任務cancel掉,然後從此Timer的任務佇列中刪除所有已取消的任務


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69979681/viewspace-2744579/,如需轉載,請註明出處,否則將追究法律責任。

相關文章