OralceJDBCシンクライアントがクエリタイムアウトをどのように実装するかについて興味がありました。これは、Java.sql.StatementのsetQueryTimeout(int seconds)メソッドを呼び出すことで設定できます。
これはクライアント側のドライバー自体に実装されていますか?新しいスレッドが生成されて結合されていますか?または、JDBCドライバーは単にパラメーターをOracleに送信してから、タイムアウトを強制しますか?
タイムアウトに達した後、クライアントとデータベースのどのリソースが解放され、どれがハングしますか?クライアントがクエリを放棄した場合でも、Oracleはクエリを実行し続けますか、それとも終了しますか?クライアント側にまだカーソルオブジェクトがありますか?
ありがとうございました
Tanel Poderは、OCI(Oracle Call Interface)を介したキャンセルの動作について 記事 を書いています。 JDBCについても同様のことが行われていると思います。シックドライバーを使用している場合は、OCIを使用して、(設定sqlnet.oraを使用して)セッションをトレースし、何が記録されるかを確認できます。
Oracle JDBC FAQ によると
ステートメントタイムアウトスレッド。このスレッドは、タイムアウトを使用してステートメントを実行すると作成されます。 ステートメントまたは接続の数に関係なく、1つのスレッドのみが作成されます。このスレッドはVMの存続期間中持続します。
SetTimeOutメソッドを使用しているときにクエリが実際にタイムアウトすると、OracleエラーコードORA-01013 - user requested cancel of current operation
を含むSQL例外がOracleサーバーからスローされます。
これは、このメッセージを送信しているのはOracleであるため、操作がキャンセルされたことを意味します優雅に(Oracleに関する限り/ Oracleが可能な限り)。
タイムアウトに達したときにサーバー側でクエリが続行されないことを私は知っています。タイムアウトに達する前または後にサーバーに送信される意図/シグナルオプションがあり、サーバーを停止する必要があることを示します。さまざまなV $テーブルでサーバーを調べて、クエリが実行されているかどうかを確認することで、これを確認しました。 (V $ SESSION、V $ SQLなど)