max_idle_blocker_timeとは
初期化パラメーターmax_idle_blocker_timeは、Oracle Database 19c以降で使用できる初期化パラメーターです。特定のSQL文をブロックしているセッションが、指定された分数アイドル状態になるとセッションを切断します。
設定
初期化パラメーターmax_idle_blocker_timeにはアイドル時間を分単位で指定します。デフォルト値は0で無効になっています。この初期化パラメーターはインスタンス単位で指定できますが、セッション単位では指定できません。当初は マニュアルには記載されていませんでしたが、その後掲載されるようになりました。下記の例では、1分が指定されています。
SQL> ALTER SYSTEM SET max_idle_blocker_time = 1;
System altered.
動作
「セッション#1」がDELETE文を実行します。max_idle_blocker_timeには1分が指定されているものとします。
SQL> SET AUTOCOMMIT OFF
SQL> DELETE FROM data1 WHERE c1=100;
3 rows deleted.
「セッション#2」はSELECT FOR UPDATE文を実行して、「セッション#1」が実行したDELETE文の対象レコードが確定するまで待機します。
SQL> SELECT * FROM data1 WHERE c1=100 FOR UPDATE;
1分が経過すると、「セッション#1」は強制的に切断され、「セッション#2」はレコードが返ります。下記の例は「セッション#1」でSELECT文を実行していますが、既に切断されているためエラー「ORA-03135: connection lost contact」が発生している様子です。
SQL> SELECT * FROM DUAL;
SELECT * FROM DUAL
*
ERROR at line 1:
ORA-03135: connection lost contact
Process ID: 26893
Session ID: 281 Serial number: 50063
制約と注意点
アイドル状態になるとセッションを切る機能には初期化パラメーターmax_idle_timeもあります。こちらはブロックしている/していないにかかわらず、一定時間アイドル状態になるとセッションを切断します。max_idle_blocker_timeは、ブロックしているセッションが切断されることが異なります。
マニュアルには「Therefore, in order for MAX_IDLE_BLOCKING_TIME to be effective, its limit must be less than the MAX_IDLE_TIME limit.」と記載されており、max_idle_blocker_time < max_idle_time とする必要があります。しかし、システム的な制限はかけられていないため、max_idle_blocker_timeの方が大きい値に設定できます。この場合は、先にmax_idle_timeが動作します。
SQL> ALTER SYSTEM SET max_idle_time = 3;
System altered.
SQL> ALTER SYSTEM SET max_idle_blocker_time = 5;
System altered.
Resource Managerには古いバージョンから既に同じ名前のディレクティブが存在します。こちらは秒数で指定します。