亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

kill指令怎么正確的在MySQL數據庫中使用

發布時間:2020-12-28 12:00:24 來源:億速云 閱讀:168 作者:Leah 欄目:開發技術

這期內容當中小編將會給大家帶來有關kill指令怎么正確的在MySQL數據庫中使用,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

KILL [CONNECTION | QUERY] processlist_id

在Mysql中每個連接都是單獨線程運行,可以使用語句 KILL processlist_id statement.來終止語句執行。

KILL允許可選 CONNECTION或QUERY 修飾符:

  • KILL CONNECTION ,KILL與無修飾符相同 :終止與給定關聯的連接 processlist_id,在終止該連接正在執行的任何語句之后。

  • KILL QUERY終止連接當前正在執行的語句,但保持連接本身不變。

使用show processlist 查看所有id

kill指令怎么正確的在MySQL數據庫中使用

Kill 指令使用

如果我們應用執行SQL后,由于鎖select for update或者數量太大,導致執行SQL卡在數據庫,此時想取消該SQL怎么辦?可以通過kill命令停止mysql線程或者是取消該SQL執行,此處需要到底是執行 kill threadId指令還是 kill query theadId指令?

kill與kill query 最大區別是是否取消該連接上執行的所有sql,即是否關閉該線程,如果關閉該線程即對應JDBC中statement關閉

-- 數據庫鎖住acctno=13記錄 然后執行如下更新語句
update test set acctname ='12' where acctno=13

show processlist查看正在執行sql的線程id

kill指令怎么正確的在MySQL數據庫中使用

如果想取消該SQL執行,可以使用命令 kill query 407 取消SQL執行,執行后407線程并不會消失,如果該連接上有SQL執行會繼續執行;但是如果使用kill 407 ,407線程會消失。使用時需要注意二者差異。

線程id除了通過show processlist查看,也可以使用編程的方式獲取threadId

 Connection connection = getConnection();
 ((MysqlConnection)connection).getSession().getThreadId();

Statement cancel方法

我們使用JDBC編程方式對數據庫進行操作時,可以也可以使用Statement對象的cancel方法進行取消,Mysql驅動內部也是發送Kill query threadId 指令,Mysql驅動cancel方法源碼

 public void cancel() throws SQLException {
    try {
      if (this.query.getStatementExecuting().get()) {
        if (!this.isClosed && this.connection != null) {
          JdbcConnection cancelConn = null;
          Object cancelStmt = null;

          try {
            HostInfo hostInfo = this.session.getHostInfo();
            String database = hostInfo.getDatabase();
            String user = StringUtils.isNullOrEmpty(hostInfo.getUser()) ? "" : hostInfo.getUser();
            String password = StringUtils.isNullOrEmpty(hostInfo.getPassword()) ? "" : hostInfo.getPassword();
            NativeSession newSession = new NativeSession(this.session.getHostInfo(), this.session.getPropertySet());
            newSession.connect(hostInfo, user, password, database, 30000, new TransactionEventHandler() {
              public void transactionCompleted() {
              }

              public void transactionBegun() {
              }
            });
            //驅動內部使用 KILL QUERY + threadId 指令取消
            newSession.sendCommand((new NativeMessageBuilder()).buildComQuery(newSession.getSharedSendPacket(), "KILL QUERY " + this.session.getThreadId()), false, 0);
            this.setCancelStatus(CancelStatus.CANCELED_BY_USER);
          } catch (IOException var13) {
            throw SQLExceptionsMapping.translateException(var13, this.exceptionInterceptor);
          } finally {
            if (cancelStmt != null) {
              ((Statement)cancelStmt).close();
            }

            if (cancelConn != null) {
              ((JdbcConnection)cancelConn).close();
            }

          }
        }

      }
    } catch (CJException var15) {
      throw SQLExceptionsMapping.translateException(var15, this.getExceptionInterceptor());
    }
  }

客戶端工具執行

客戶端工具執行SQL后取消執行,有些工具發 kill 命令 有些發kill query 指令,可以通過抓包工具驗證下Navicat工具發送什么指令,抓包工具推薦Wireshark,很強大。

kill指令怎么正確的在MySQL數據庫中使用

是kill 指令,對應的線程ID為407,也有部分工具是發送的kill query指令。

上述就是小編為大家分享的kill指令怎么正確的在MySQL數據庫中使用了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

恭城| 淳化县| 辛集市| 保靖县| 介休市| 英山县| 海南省| 青海省| 基隆市| 兴文县| 清水县| 余干县| 苏尼特左旗| 大新县| 沾化县| 图木舒克市| 九龙坡区| 武隆县| 台东县| 宾阳县| 友谊县| 定西市| 隆昌县| 保亭| 钟祥市| 杂多县| 武安市| 马山县| 张掖市| 宝坻区| 五大连池市| 正安县| 即墨市| 白城市| 武鸣县| 周口市| 金阳县| 焦作市| 朔州市| 托里县| 许昌市|