2013-02-15 61 views
0

我一直在閱讀很多關於停止線程,但我一直未能找到我的問題的解決方案:在更新語句中卡住線程:取消或關閉語句,並中斷線程不起作用

我有一個連接3個線程的Sybase DB連接。 加一個線程來監視這3個線程。但是,由於服務器超負荷(我知道:我應該修復這個問題,但我們沒有錢),呼叫: 聲明stmt.executeUpdate(「更新來自some_table的東西」); 永不退貨。

這裏就是線程大致不(不編譯,因爲它是不可再生反正):

class runQuery implements Runnable { 
    public Connection conn; 
    public long lastQueryRunTime = 0; 
    public Statement stmt; 
    public volatile keepongoing = true; 

    runQuery(Connection conn, String Probe, String Server, int thisthread) { 
     this.conn = conn; 
     Class.forName("com.sybase.jdbc2.jdbc.SybDriver"); 
     conn = DriverManager.getConnection("jdbc:sybase:Tds:"+Server+":4100?SERVICENAME="+Probe,"login","password"); 
    } 

    public void run() { 
     while(keepongoing) { 
     query = "update something from some_table"; 
     lastQueryRunTime = System.currentTimeMillis()/1000; 
     stmt = conn.createStatement(); 
     stmt.setQueryTimeout(4); 
     int result = stmt.executeUpdate(query); 
     lastQueryRunTime = 0; 
    } 
} 

這應該給一個大概的瞭解。 另一方面,我有一個「MonitorThemAll」線程來檢查lastQueryRunTime:如果它太長,我想......做點什麼!

所以,從監控線程,我試過: 改變keepongoing標誌......但因爲線程卡在更新查詢,它並沒有做太多 然後: stmt.cancel() stmt.close()=>它似乎沒有太多。執行kill -3表明線程仍然卡在executeUpdate行。

我搬到了更有力的解決方案: conn.close()=>從那裏,我得到的例外「JZ0C0:連接已關閉」每次我嘗試stmt.cancel /關閉(這些異常是由語句拋出.cancel/close命令:即:它們在MonitorThemAll線程中,而不在runQuery線程中......) 還有: mythread.interrupt()=>之後仍然停留在更新查詢中!

我用盡了在這裏找到的解決方案和谷歌... 由於thread.close()已被棄用(儘管我想避免,以便我可以恢復所使用的資源),但是,我不知道我還有什麼可以嘗試...

有沒有人有任何想法嘗試?

+0

更新後不想執行conn.commit()嗎?我認爲你有經典的數據庫死鎖問題。 – 2013-02-15 14:19:39

+0

如果線程剛剛繼續運行(即多個更新仍在進行),或者它只是停留在executeUpdate中,您是否嘗試過打印? – 2013-02-15 14:22:35

+0

你能澄清你想要做什麼嗎?如果數據庫需要很長時間才能做出迴應..你想......什麼? – 2013-02-15 14:24:48

回答

1

假設您的問題是sql查詢太長而無法執行,您可以將sql查詢傳遞給後臺線程以執行查詢並在查詢完成時獲取結果(通過回調監聽器或一個隊列)。

+0

實際上,查詢從不返回......它只是永遠停留在那裏。 「正常超時」已經由「stmt。setQueryTimeout(4);「這引發了一個異常,我處理 – Loose 2013-02-15 14:31:55

+0

另外,我想實現的,最後: 線程卡在executeUpdate」forever「=>我需要一種方法來退出此executeUpdate並繼續前進(這是最親切的方式,但通常的取消/關閉不起作用)......或者以某種方式使線程停止,或者殺死線程或任何需要的東西(從親切的退出到殘暴的殺死) – Loose 2013-02-15 14:34:43

+0

你不能殺死一個線程在Java.Only試圖中斷它,它會停止,如果行爲正常。所以你需要調查爲什麼查詢永遠不會返回並解決這個問題。首先想到的是,表被鎖定,這就是爲什麼查詢不是return.Try來驗證這個 – Cratylus 2013-02-15 14:44:03