3

SQL Developerでは、「タスクのキャンセル」ボタンをクリックすると、問合せの実行がただちに停止します。プロジェクトに同じ機能を実装する必要があります。

クエリ画像をキャンセル

クエリを実行するための ORM ツールとして BC4J を使用しています。結果を取得するために、いくつかのデータベース関数/手順を呼び出すビューオブジェクトを介して呼び出される検索クエリの実行をキャンセルする必要があります。

使用してみviewObject.cancelQuery();ましたが、効果がありません。クエリは最後まで実行され続けます。

BC4J によって処理される JDBC 接続プールを介して接続しています。

4

1 に答える 1

2

私の提案は

  • クエリが送信されたとき
    • すべての UI コマンドをブロックし、「キャンセル」を受け入れます (最も簡単な方法: この目的のためにモーダル ダイアログを使用します。より便利な方法: ローカル ビュー コマンドのみをブロックします)。
    • UI スレッドとは別のスレッドでクエリを開始し、Runnable実装を 使用します。
      • 独自のcancel()メソッドがあり、
        • cancelQueryrespを呼び出します。cancelあなたのクエリの
        • <query thread>.interrupt();を使用して、このイベントを実行可能なクエリに通知します。この目的のために、クエリ スレッドへの参照を に保存する必要があります<query thread>。アクティブな IO 操作は、このシグナルによって中断されることがあります。
      • これらの例外がロールバック トランザクションでキャッチされた場合 (読み取り専用クエリでトランザクションが開始された場合)InterruptedExceptionに対処できます。SQLExceptionrun()
      • このランナブルに複数の実行時間の長いステートメントがある場合はThread.currentThread().isInterrupted()、各ステートメントの後にチェックし、cancel()結果が true の場合
  • クエリの終了時に、その結​​果を UI と同期します
  • キャンセル時:
    • cancel()実行可能なクエリの呼び出し
    • スレッドを忘れます (ただし、キャンセルされたスレッドがまだ終了していない場合は、システム リソースまたは接続プールを使い果たしないように注意してください)。
    • UI のブロックを解除する

Swing と Eclipse RCP には、この設計をサポートするヘルパー クラスがあります。

于 2013-03-01T12:12:47.517 に答える