Oracleで5分以上実行されているすべてのセッションを強制終了するプロシージャ/ジョブを作成する方法
それで、v $ sessionをクエリし、特定のユーザー、プログラムのペアがセッションが5分以上アクティブである場合は、それを強制終了することを確認します。
また、そのペアに対してこの手順を5分まで1分ごとに実行するジョブを作成し、(sidによって)プロセスを強制終了する方法も説明します。
create or replace procedure kill_session( p_sid in number, p_serial# in number )
as
begin
for x in ( select *
from v$session
where username = USER
and sid = p_sid
and serial# = p_serial# )
loop
execute immediate 'alter system kill session ''' ||
p_sid || ',' || p_serial# || '''';
dbms_output.put_line( 'Alter session done' );
end loop;
end;
セッションが5分以上アクティブである場合に時間を確認する方法、および特定のユーザーとプログラムのペアで5分まで実行する方法
一般に、データベースクエリとDMLを中止することは良い考えではありません。 @ Raj がすでに指摘しているように、セッションを強制終了することも悪い考えです。実際にはさらに悪いことです。
セッションは、(ユーザーのUNDOテーブルスペース内の)UNDOスペースを消費し、テーブルのロックを保持し、一時テーブルスペース内のスペース(行のソートなど)を占有するトランザクションを実行している可能性があります。セッションを終了すると、進行中のトランザクションによって実行されたすべての作業がロールバックされ、すべての取り消しセグメントとロックが解放されます。また、「軽い」セッションはかなり早く終了する可能性がありますが、Oracleエンジンがすべてをクリーンアップするまでに時間がかかるものもあります。
あなたの質問に答えるには、なぜあなたがあなたのセッションを殺しているのかを知る必要があります。
おそらく、セッションの終了を回避するようにビジネスロジックを改善できます。たとえば、サーバー側で計算を行うことができます。
または、中間層(アプリケーションサーバー)で実行され、接続プールを使用してデータベースへの適切な少数の接続を維持しながら、ユーザーに代わってクエリを実行するRESTful Webアプリケーションを開発することもできます。たとえば、Java Apache Tomcat JDBC接続プールを使用してサーブレットとJSPを含むWebアプリケーション( Tomcat 8の公式ドキュメント )と記述できます。専用サーバーから切り替えることもできます。 共有サーバーアーキテクチャ を優先するアーキテクチャ。
ソフトウェアが接続プールをサポートしていない場合は、 OCI経由のデータベース常駐接続プール を使用できます。
しかし、私があなたのニーズを満たすことを提案したものがない場合は、データベースリソースマネージャーを使用してリソースプランを実装し、実行中のクエリを中止するディレクティブを定義するか、長時間実行またはアイドル状態のセッションを強制終了することができます。 Oracle Database Resource Managerを使用したリソースの管理 『Oracle Database管理者ガイド』のキーワードはCANCEL_SQL
、KILL_SESSION
、MAX_EST_EXEC_TIME
、MAX_IDLE_TIME
。