0

負荷の高いデータベース操作を実行する Java スレッドがあります。この Java スレッドを強制終了する API をコーディングしています。これにはエグゼキューター フレームワークを使用しているので、future を取得したら、future.cancel() を呼び出してから、スレッドの中断を確認します。

上記のロジックは、スレッドが DB 操作を実行しているシナリオを除いて正常に機能します。これは、スレッドを強制終了すると、最初に DB 接続を強制終了することを意味し、DBA の介入を意味します。

私の目標は、サポート チームの介入を必要としない API を作成することです。

これをどのように行うかについてのアイデアは非常に役立ちます。

コード:

private void killBatches1() {
    if (killBatchRunning.compareAndSet(false, true)) {
    try{
        Iterator<Future<?>> futureIterator = futuresForBatch.iterator();
        while (futureIterator.hasNext()) {
            Future<?> future = futureIterator.next();
            if (future.cancel(true))
                ;
            futureIterator.remove();
        }
      }finally{
        killBatchRunning.set(false);
        }
    }
4

2 に答える 2

1

それをしないでください!!! スレッドがDB操作を開始し、それを強制終了すると、データベースに問題が発生する可能性があります。スレッドがデータベースを更新していて、それを強制終了したとします。取引は終了しましたか?変更はコミットされていますか?スレッドを強制終了すると、ロールバックを実行する必要があります。これは、「大量のデータベース操作」と言っているため、非常にコストがかかる可能性があります。(私は何時間ものデータベースのロールバックを経験しました...そして私はそれらを嫌うようになりました)。

技術的には、OSにアクセスし、DB接続プロセスを検索して強制終了することもできますが、前述したように、これは悪い習慣であるだけでなく危険です。

したがって、私のアドバイスは、大きなデータベース操作を小さなチャンクで実行する方法を見つけることです。そうすれば、応答性と制御が向上します。

于 2013-02-28T08:18:13.773 に答える
0

理論的には、threadinterrupt()を呼び出すことができます。JDBCドライバーが割り込みをサポートしている場合、適切な例外が呼び出されます。これはコードでキャッチする必要があります。そうでない場合は、接続を閉じてみてください。それも例外をスローするはずです。とにかく、JDBCドライバーの仕様でこの質問を調べてください。

于 2013-02-28T08:29:25.790 に答える