我一直在閱讀很多關於停止線程,但我一直未能找到我的問題的解決方案:在更新語句中卡住線程:取消或關閉語句,並中斷線程不起作用
我有一個連接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()已被棄用(儘管我想避免,以便我可以恢復所使用的資源),但是,我不知道我還有什麼可以嘗試...
有沒有人有任何想法嘗試?
更新後不想執行conn.commit()嗎?我認爲你有經典的數據庫死鎖問題。 – 2013-02-15 14:19:39
如果線程剛剛繼續運行(即多個更新仍在進行),或者它只是停留在executeUpdate中,您是否嘗試過打印? – 2013-02-15 14:22:35
你能澄清你想要做什麼嗎?如果數據庫需要很長時間才能做出迴應..你想......什麼? – 2013-02-15 14:24:48