MLEコール仕様のランタイム分離

MLEでは、実行コンテキストを使用してランタイム状態の分離が維持されます。コール仕様は、同じユーザー、モジュールおよび環境を共有していない場合、個別のコンテキストに関連付けられます。

MLE実行コンテキストは、分離されたスタンドアロンのランタイム環境として機能します。実行コンテキストを共有するJavaScriptコードはすべて、そのランタイム状態のすべて(以前に定義されたグローバル変数など)に対するフル・アクセス権を持っています。それ以外の場合、ある実行コンテキストで実行されるコードが、別の実行コンテキストのランタイム状態を表示したり、変更する方法はありません。コール仕様の実行コンテキストは、対応するコール仕様のいずれかへの最初のコールで透過的に作成されます。詳細は、「MLE実行コンテキストについて」を参照してください

セッションでコール仕様を実行するときに、MLEは、コール仕様で指定されたモジュールをロードし、そのモジュールによってエクスポートされたファンクションをコールします。2つのコール仕様の実行で同じ実行コンテキストを共有するには、同じMLEモジュールからファンクションをエクスポートし、同じ環境を使用して、同じユーザーが実行する必要があります。同じセッション内の異なるユーザーの代理としてのSQLまたはPL/SQLコールが、同じ実行コンテキストで実行されることはありません。

モジュールのランタイム表現はステートフルです。状態には、JavaScriptモジュールの変数や、モジュール内のコードにアクセスできるグローバル・スコープの変数などが含まれます。同じセッション内で、MLEは複数のモジュール・コンテキストを使用してコール仕様を実行できます。コール仕様によって参照されるモジュールまたは環境が変更されると、実行コンテキストが無効になり、エラーがスローされます。例6-4に、この概念を示します。

セッション状態は、データの整合性のために非常に重要です。変更されたセッション状態に関連するエラー(モジュール変更の場合はORA-04106、JavaScriptの環境変更の場合はORA-04107、PL/SQLパッケージの場合はORA-04068)を捕捉しないと、サイレント・データ破損が発生する可能性があります。初期化パラメータSESSION_EXIT_ON_PACKAGE_STATE_ERRORTRUEに設定すると、セッション状態が無効になるとセッションが強制的に切断されます。多くのアプリケーションがセッション切断を取得するため、このオプションを使用すると、既存のセッション状態の無効化からのリカバリを簡略化できます。SESSION_EXIT_ON_PACKAGE_STATE_ERRORの詳細は、Oracle AI Databaseリファレンスを参照してください。

ノート:

パッケージおよびJavaScriptモジュールに状態を格納することはお薦めしません。セッション状態は、データベースによって最適に処理されます。

同じMLEモジュールからファンクションを公開する(および同じ環境を使用する)定義者権限のコール仕様はすべて、同じ実行コンテキストを共有します。これは、すべての実行が定義者の代理として発生するためです。逆に、コール仕様が実行者権限として宣言された場合は、コール・ユーザーごとに別個の実行コンテキストがあります。

コール仕様を作成する方法の詳細は、「MLEコール仕様のコンポーネント」を参照してください

関連項目:

SESSION_EXIT_ON_PACKAGE_STATE_ERRORを使用して、PL/SQLパッケージの状態が無効化されている場合の動作を指定する方法の詳細は、Oracle AI Database PL/SQL言語リファレンスを参照してください

例6-4 実行コンテキストの依存関係

この例は、モジュールまたは環境が変更されると、関連する実行コンテキストが無効になることを示しています。

CREATE OR REPLACE MLE MODULE count_module
LANGUAGE JAVASCRIPT AS

let myCounter = 0;

export function incrementCounter(){
    return ++myCounter;
}
/

CREATE OR REPLACE FUNCTION increment_and_get_counter
RETURN NUMBER
AS MLE MODULE count_module
SIGNATURE 'incrementCounter';
/

セッション1は、ファンクションincrement_and_get_counterを起動して実行コンテキストを作成します。

SQL> SELECT increment_and_get_counter;

INCREMENT_AND_GET_COUNTER
-------------------------
                        1

SQL> SELECT increment_and_get_counter;

INCREMENT_AND_GET_COUNTER
-------------------------
                        2

別のセッション(セッション2とします)からファンクションを起動する別のユーザーが、最初のセッションのコンテキストとは関連がない別の実行コンテキストを作成します。

SQL> SELECT increment_and_get_counter;

INCREMENT_AND_GET_COUNTER
-------------------------
                        1

セッション1のユーザーは、いくつかの新しいコメントをファンクションに追加してMLEモジュールを再作成します。

CREATE OR REPLACE MLE MODULE count_module
LANGUAGE JAVASCRIPT AS

let myCounter = 0;

/**
* increments a counter before returning the value
* to the caller
*@returns {number} the value of the counter
*/
export function incrementCounter(){
    return ++myCounter;
}
/

この操作は、セッション状態を無効にする必要があることを、count_moduleを参照するすべての実行コンテキストに通知します。セッション2は、無効化に対応してエラーを取得します:

SQL> SELECT increment_and_get_counter;

SELECT increment_and_get_counter
*
ERROR at line 1:
ORA-04106: Module USER2.COUNT_MODULE referred to by INCREMENT_AND_GET_COUNTER has been modified since the execution context was created.

セッション2でのファンクションの次回の起動は、再初期化されたセッション状態で開始されます。

SQL> SELECT increment_and_get_counter;

INCREMENT_AND_GET_COUNTER
-------------------------
                        1

PL/SQLパッケージと同様に、セッション1からファンクションを起動してもエラーは発生しません。ただし、セッション状態は、ファンクションへの後続のコールで示されているように破棄されています。

SQL> SELECT increment_and_get_counter;

INCREMENT_AND_GET_COUNTER
-------------------------
                        1

セッション2で初期化パラメータSESSION_EXIT_ON_PACKAGE_STATE_ERRORTRUEに設定されている場合、ORA-04106エラーがスローされ、データベースへの接続が切断されます。

ALTER SESSION SET SESSION_EXIT_ON_PACKAGE_STATE_ERROR = TRUE;
SELECT increment_and_get_counter;
結果:
SELECT increment_and_get_counter
                               *
ERROR at line 1:
ORA-04106: Module USER2.COUNT_MODULE referred to by INCREMENT_AND_GET_COUNTER has been modified since the execution context was created.

ERROR:
ORA-03114: not connected to ORACLE