0

スレッドの停止について多くのことを読んできましたが、問題の解決策を見つけることができませんでした:

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() は非推奨であるため(それでも、リソースを回復できるように避けたいと思います)、わかりません他に何を試すことができますか...

試してみるべきことについて何か考えがある人はいますか?

4

1 に答える 1

1

SQL クエリが長すぎて実行できないことが問題であると仮定すると、SQL クエリをバックグラウンド スレッドに渡してクエリを実行し、クエリが終了したときに (コールバック リスナーまたはキューを介して) 結果を取得できます。

于 2013-02-15T14:23:58.357 に答える