2009-03-17 15 views
7

Oracle 10gデータベースに対してJava JDBCアプリケーションを実行しています。私は、PreparedStatementを設定してクエリを実行し、ps.executeQuery()を呼び出して実行します。場合によってはクエリに時間がかかり、それを強制終了する必要があります。私は別のスレッドがPreparedStatementオブジェクトにアクセスし、その上でcancel()を呼び出します。JDBCアプリケーションでPreparedStatement.cancel()を呼び出すと、実際にOracleデータベースでそれが強制終了されますか?

私の質問ですが、これは実際にはデータベース内のクエリを強制終了しますか?それとも、クライアントからそれを切り離しても、クエリはまだOracleの中のどこかで実行されていますか?

ありがとうございます!

答えて

8

答えは、実装品質の問題です。 Statement.cancel()のjavadocを見ると、「DBMSとドライバの両方がSQL文を打ち切ることをサポートしている」ということが起こります。

さまざまなバージョンのOracle JDBCドライバでの私の経験では、Statement.cancel()はあなたが望むことをするようです。キャンセルすると、クエリはすぐに実行を停止するようです。

+0

私の場合はありません。 https://stackoverflow.com/questions/44383579/how-do-i-forcibly-close-connections-from-a-connection-pool – supertonsky

1

使用しているドライバによって異なりますが、ドライバとデータベースは、ステートメントのキャンセルをサポートして、必要に応じて動作させる必要があります。オラクルはこの機能をサポートしていますが、確かに知るために使用している特定のドライバについてもっと知る必要があります。

また、長時間実行されているクエリを開始してキャンセルした後にデータベースを調べることで、簡単なテストを実行できます。

10

私が下で言うことは、オラクルが使用している観測と推論に基づいており、オラクル内部の深い理解に基づいているわけではありません。それのどれも権威あると見なすべきではありません。

最初の段落で何が正しいと言われましたか。ただし、テストが示唆されたことに注意してください。長時間実行されるすべてのOracleクエリーが同じであるとは限りません。クエリは2つのフェーズで評価されるようです。最初に、正しい順序で行を返す方法を知るための十分なデータを組み合わせたフェーズと、2番目のフェーズでは、第1段階。 2つのフェーズ間の作業の分割は、コストベースのオプティマイザの設定によっても影響を受けます。例えば最初の行と全行。

ここで、クエリがフェーズ1にある場合、キャンセル要求はフェーズ1の最後にキューに入れられているように見えます。つまり、クエリは引き続き動作します。

フェーズ2では、行がバンチで返され、各バンチ後にキャンセルコマンドが有効になるため、ドライバがコマンドをサポートしていると仮定すると、キャンセル要求によってクエリが強制終了されます。

JDBCキャンセルコマンドの仕様では、クエリの実行が停止しないために何が起こるのかわからないため、コマンドは強制終了の確認を待つか、タイムアウトしてクエリが実行されたまま戻ることがあります。

関連する問題