スレッドの停止について多くのことを読んできましたが、問題の解決策を見つけることができませんでした:
3 つのスレッドが接続された Sybase DB 接続があります。さらに、これら 3 つのスレッドを監視するための 1 つのスレッド。
ただし、サーバーが過負荷になっているため (修正する必要があることはわかっていますが、まだお金がありません)、Statement stmt.executeUpdate("update something from 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;
}
}
それは大まかなアイデアを与えるはずです。一方で、lastQueryRunTime をチェックする「MonitorThemAll」スレッドがあります。長すぎる場合は、何かしたいのですが。
だから、監視スレッドから、私は試してみました: keepongoing フラグを変更します...しかし、スレッドが更新クエリでスタックしているため、あまり機能しません 次に: stmt.cancel(), stmt.close() =>あまり効果がないようです。kill -3 を実行すると、スレッドがまだ executeUpdate 行で停止していることがわかります。
私はより強力な解決策に移りました: conn.close() => そこから、stmt.cancel/close を試みるたびに「JZ0C0: Connection is already closed」という例外が発生します (これらの例外は stmt.cancel/close コマンドによってスローされます)。 : すなわち: それらは runQuery スレッドではなく MonitorThemAll スレッドにあります...) また: mythread.interrupt() => その後も更新クエリでスタックしています!
こことGoogleで見つかったソリューションが不足しています... thread.close() は非推奨であるため(それでも、リソースを回復できるように避けたいと思います)、わかりません他に何を試すことができますか...
試してみるべきことについて何か考えがある人はいますか?