• 締切済み

クエリをキャンセルしたいのですが。。。

一度発行したクエリをキャンセルしたいのですが、何かやり方ありますか?セッションを落とすしかないでしょうか。 アプリケーションから実行するのですが他のクライアントのセッションは落とさないように区別したいと思います。

みんなの回答

回答No.3

(1)select * from v$session;でsid列とserial#を特定します (2)その後、alter system kill session です。 クライアントには ORA-3113や3114、1041が帰るはずです。

jkz
質問者

補足

コメントありがとうございます。 (1)のsid列とserial#の特定をどうやるかがわかっていません。DB接続時に自分のsid列とserial#を確実に特定できるものでしょうか? DB管理者がkillするだけなら目視確認すれば良いのでしょうか。。。 アプリケーションでは複数のログインユーザーIDを管理していますが、DB操作に使用しているOracle上のユーザーIDは1つなので特定するためのキーにはなりません。 (アプリケーションのログインユーザーIDは数が多く、かつ増減が多いのでNGと考えております。) DB接続直後にv$session-sidの最大値を取得し、それが自分のセッションだと判断するくらいでしょうか?

すると、全ての回答が全文表示されます。
  • cse_ri2
  • ベストアンサー率25% (830/3286)
回答No.2

Javaはあまり詳しくないので、一般的なC/Sアプリケーション を例にとって話しますが、Oracleとの接続で非同期接続を プログラムで実現していれば、クエリーをキャンセルさせる ことができます。 ただしその時でも、Oracle側での検索は続いていますので、 Oracleサーバの負荷は下がりません。 同期接続の場合、Oracleサーバでの検索が終了して最初の 検索結果が返ってくるまで検索はキャンセルできません。 JavaBeanで接続しているとのことですので、そのJavaBean を作った人または作った会社に問い合わせて、どうやったら Oracleとの接続をキャンセルすることができるか、詳しく 聞いてみたらいいでしょう。 最後の手段はセッション切断しかないと思います。

jkz
質問者

補足

コメントありがとうございます。 JavaBeanを作った人には問合せしましたが「できない」 といわれています。 Oracleサーバの負荷を減らしたいのです。 結果セットとして大量データができるクエリを1クライアントが実行/キャンセルを繰り返したらサーバーのリソースが不足してしまうのでキャンセルされたらリソースを解放する必要があると考えています。 セッション切断しかないでしょうか。 またセッション切断をアプリケーションで実現するとしたら処理は下記のような感じでしょうか。 1.クエリ実行(セッションID取得) 2.キャンセルイベント 3.別セッションでDB接続して1.のセッションをkillする。

すると、全ての回答が全文表示されます。
  • cse_ri2
  • ベストアンサー率25% (830/3286)
回答No.1

データベースは何ですか? また使用しているクライアント側のアプリケーションは?

jkz
質問者

補足

データベースはOracle 8.0.5です。 使用しているクライアント側のアプリケーションは JDBCドライバ経由のJavaBeanです。

すると、全ての回答が全文表示されます。

関連するQ&A