2013-02-19 128 views
3

在SQL Developer中,點擊取消任務按鈕可以立即停止執行查詢。我必須在我們的項目中實現相同的功能。SQL Developer中的「取消查詢」是如何工作的

cancel query iamge

我使用BC4J作爲一個ORM工具來執行查詢。我必須取消一個名爲thorugh視圖對象的搜索查詢執行,它會調用幾個數據庫函數/過程來獲得結果。

我試過使用viewObject.cancelQuery();但它沒有任何影響;查詢一直執行到最後。

我通過JDBC連接池進行連接,由BC4J處理。

+0

你得到的錯誤信息是什麼? – Incognito 2013-02-19 12:19:14

+0

我認爲它直接像KILL一樣在MySQL中執行。 – 2013-02-19 12:19:18

+1

@ bmorris591不是殺人。是取消查詢。會議不會死亡。 – 2013-02-19 12:24:10

回答

2

我的建議是

  • 當查詢提交
    • 塊中的任何UI命令接受「取消」(最簡單的方法:用一個模式對話框用於此目的,更方便用戶:塊只有本地視圖命令)
    • 開始從UI線程不同的一個單獨的線程查詢,使用Runnable實現其
      • 都有自己的cancel()方法,
        • 來電cancelQuery resp。您的查詢的cancel
        • 使用<query thread>.interrupt()將此事件標記爲您的查詢可運行;爲此,您需要在<query thread>中存儲對查詢線程的引用。有效的IO操作有時會被這個信號中斷!
      • 能夠在run()InterruptedExceptionSQLException應對措施:如果這些異常逮住回滾事務(如果一個人開始在所有的只讀查詢)
      • 如果有多個長時間運行的語句在此可運行然後每個語句後檢查Thread.currentThread().isInterrupted()cancel()如果結果爲真
  • 上完成查詢與您的用戶界面同步,其結果
  • 上取消:查詢可運行的
  • 忘記線程
    • 呼叫cancel()(但千萬不要耗盡系統資源或連接池如果有太多的取消線程仍然還沒有完)
    • 疏通你的UI

有輔助類的搖擺以及在Eclipse RCP的支持這種設計。