4.5 Javaセッションの状態に使用する2層の期間

11gリリース1 (11.1)以前では、Javaセッションの状態は単一層で、ここには、Javaの実行に関連するすべての値(システム・プロパティの値や静的変数の値など)、およびセッション中にロードされたクラスのセットなどが含まれていました。この状態の期間は、RDBMSセッションで最初にJavaメソッドを起動すると開始し、java.lang.System.exitまたは類似するOracleRuntimeメソッドのコール、捕捉されない例外、致命的エラーまたはRDBMSセッションの終了のいずれかによってJVMが終了するまで続いていました。この場合、Javaコードの変更が必要であり、さらにRDBMSコールの終了前にセッションを完全に終了することができませんでした。そのため、同じコール内で新しいJavaセッションを起動できませんでした。

11gリリース1 (11.1)以降では、Javaセッションの状態が2層に分けられています。一方の層の期間の方が長く、この中にもう一方の層の期間が含まれます。短い層の期間は以前と同じで、つまり、Javaメソッドを起動すると開始し、JVMが終了すると終了します。長い層の期間は、RDBMSセッションで最初にJavaメソッドを起動すると開始します。このセッションは、RDBMSセッションが終了するか、またはファンクションdbms_java.endsession_and_related_stateのコールによってセッションを明示的に終了するまで続きます。Javaセッションの2種類の期間で構成される、次の2つのPL/SQLファンクションをDBMS_JAVAパッケージに追加することで、この問題に対応しています。

  • FUNCTION endsession RETURN VARCHAR2;

    このファンクションは、以前にJavaを実行したときからRDBMS現行セッションに残っているJavaセッションの状態をすべて消去します。戻り値は、実行されるアクションを示すメッセージです。

  • FUNCTION endsession_and_related_state RETURN VARCHAR2;

    このファンクションは、以前にJavaを実行したときからRDBMS現行セッションに残っているJavaセッションの状態と、Javaの実行に関連するサポート・データ(プロパティの設定や出力仕様など)をすべて消去します。戻り値は、実行されるアクションを示すメッセージです。

Javaの実行に関連するほとんどの値は、引き続き短い層にあります。JVMを複数起動する場合に役立つ値は、長い層に移動されました。たとえば、dbms_java.set_propertyで設定するシステム・プロパティの値や出力リダイレクトの仕様などです。