2022年3月14日月曜日

CS_SESSION.SWITCH_SESSIONを呼び出しコンシューマー・グループを変更する

 少し前にAutonomous DatabaseにてパッケージCS_SESSIONのSWITCH_SERVICEを呼び出すことにより、リソース・マネージャのコンシューマー・グループの切り替えができるようになりました。

パラレル・クエリまで実行して動作を確認するのは手間がかかるので、単純にセッションに設定されているサービス名を確認してみます。

最初にAPEXのワークスペースからパッケージCS_SESSIONを呼び出せるよう、実行権限を与えます。

grant execute on cs_session to <APEXワークスペース・スキーマ名>;

データベース・アクションSQLより実行します。APEXのワークスペース・スキーマをAPEXDEVとします。

grant execute on cs_session to apexdev;


APEXのアプリケーション・ビルダーを開きます。

アプリケーション作成ウィザードを起動し、コンシューマー・グループを切り替えを確認するために使用する簡単なアプリケーションを作成します。アプリケーションの名前コンシューマー・グループの切り替えとし、空のアプリケーションを作成します。

アプリケーションの作成を実行します。


アプリケーションが作成されたら、ページ・デザイナにてホーム・ページ(ページ番号1)を開きます。


ホーム・ページのContent Bodyにリージョンを作成します。識別タイトルセッション情報タイプとしてクラシック・レポートを選択します。ソース位置ローカル・データベースタイプとしてSQL問合せを選択し、SQL問合せとして以下を記述します。

select
sys_context('USERENV','SID') sid
, sys_context('USERENV','SESSIONID') audsid
, sys_context('USERENV','SERVICE_NAME') service_name
from dual


以上でアプリケーションを実行し、レポートの表示を確認します。

デフォルトのコンシューマー・グループはLOWです。SERVICE_NAMEより、コンシューマー・グループがLOWであることが確認できます。


コンシューマー・グループを切り替えるプロセスを作成します。

リージョンの前プロセスを作成します。識別名前HIGHへ切り替えとし、タイプとしてコードを実行を選択します。ソースPL/SQLコードには以下を記述します。

begin
cs_session.switch_service('HIGH');
end;


再度、レポートを確認します。

SERVICE_NAMEより、コンシューマー・グループがHIGHに切り替わっていることが確認できます。


副作用がないかどうか、データベース・アクションよりV$SESSIONを検索して確認します。

select sid, audsid, service_name from v$session;


APEXのページ・プロセスが終了した後に、コンシューマー・グループがHIGHのままのセッションが存在していることが確認できます。

意図しない動作が発生しないように、リージョンの後プロセスを作成し、PL/SQLコードとして以下を実行します。コンシューマー・グループをLOWに戻します。

begin
cs_session.switch_service('LOW');
end;


データベース・アクションからSELECT文を実行すると、先ほどとは異なりコンシューマー・グループがHIGHのサービスは残っていないことが確認できます。


レポートの遅延ロードONの場合は、ページ・プロセスとは異なるデータベース・セッションにてSELECT文が実行されます。そのため、コンシューマー・グループが切り替わりません。


遅延ロードでは、アプリケーション定義セキュリティデータベース・セッションのセクションに含まれる初期化PL/SQLコードPL/SQLコードのクリーンアップにコードを記述して対応することができます。


この設定ではアプリケーション全体のコンシューマー・グループが切り替わります。

Autonomous Databaseでのコンシューマー・グループの切り替え処理の確認については以上です。

Oracle APEXのアプリケーション作成の参考になれば幸いです。