1.3 Oracle JVMの概要
Oracle JVMは、Pure Javaアプリケーションを実行する標準的なJava互換環境です。これは、標準のJLSおよびJVMの仕様と互換性があります。標準Javaバイナリ形式および標準Java APIをサポートしています。また、Oracle Databaseは、実行時の動的クラス・ロードなど、標準のJava言語のセマンティクスに準拠しています。
Oracle DatabaseにおけるJavaでは、次の用語が使用されます。
-
セッション
Oracle DatabaseのJava環境で使用しているセッションは、Oracle Databaseで標準的に使用されるセッションと同じ意味です。通常、セッションとは、1人のユーザーがサーバーに接続している期間で区切られます(例外もあります)。Javaコードをコールするユーザーは、サーバーでセッションを確立する必要があります。
-
コール
ユーザーがセッション内でJavaコードを実行する場合、これをコールと呼びます。コールは次のような様々な方法で開始できます。
-
SQLクライアント・プログラムによるJavaストアド・プロシージャの実行。
-
トリガーによるJavaストアド・プロシージャの実行。
-
PL/SQLプログラムからのJavaコードのコール。
定義されているいずれの場合も、コールが開始され、Java、SQLまたはPL/SQLコードのいずれかの組合せが実行されて完了し、コールが終了します。
-
ノート:
セッションとコールの概念は、Oracle Databaseの使用時に必ず適用されます。
他のJava環境とは異なり、Oracle JVMは、Oracle Database内に埋め込まれているため、多くの新しい概念が導入されています。この項では、Oracle JVMと一般的なクライアントJVMとの重要な相違点をいくつか説明します。
1.3.1 プロセス領域
標準的なJava環境では、コマンドラインで次のコマンドを発行することで、インタプリタを介してJavaアプリケーションを実行します。このコマンドで、classname
は、JVMで最初に解析するクラスの名称です。
java classname
Oracle JVMを使用する際には、アプリケーションをデータベースにロードし、インタフェースを公開してから、データベース・セッション内でアプリケーションを実行する必要があります。データベース・セッションは、Oracle JVMが実行している環境であり、そのため、標準的なクライアントJVMが実行しているオペレーティング・システム・プロセスと類似しています。
1.3.2 Javaセッションの初期化、期間およびエントリ・ポイント
標準的なクライアントベースのJavaアプリケーションでは、トップレベルのメソッド(public static void main(String args[])
)が1つ宣言されます。このメソッドは1回実行され、Java仮想マシンのインスタンス化はそのコールの期間中、続きます。しかし、Oracle Javaアプリケーションは、単一のトップレベルの主なエントリ・ポイントに制限されず、Oracle JVMのインスタンス化の期間は、単一のコールおよびこのエントリ・ポイントからのコールの終了によって決定されません。各クライアントは、セッションを開始し、トップレベルのエントリ・ポイント経由でサーバー側の論理モジュールをコールし、セッションを終了します。同じJVMインスタンスは、セッションの期間全体に設定されたままであるため、静的変数の値などのデータ状態は、トップレベルの複数のエントリ・ポイントへの複数のコールにわたって使用できます。
データベースにロードおよび公開されたクラス定義は、通常、そのデータベース内のすべてのセッションで使用可能です。指定したセッション内のJVMインスタンス、Javaデータ・オブジェクト、そのJVMインスタンス内のグローバル・フィールド値は、セッションに対してプライベートです。このデータは、セッションの期間中存在し、そのセッションの存続期間内の複数のコールによって使用できます。しかし、このデータは他のセッションでは参照できず、データはどの方法でも他のセッションと共有できません。これは、標準的なクライアントJavaアプリケーションの、mainメソッドの離れた起動で同じクラス定義を共有する方法に類似していますが、これらの起動中に作成および使用されるデータは切り離されています。
1.3.2.1 JDK 11およびモジュールのサポート
このリリース以降、Oracle JVMでJDK 11およびJavaモジュールがサポートされます。
JDK 11では、クライアントベースのJavaアプリケーションを1つ以上のモジュールに関連付けることができます。メインのJavaクラスをモジュールのメンバーにすることができ、Javaコマンドライン引数--add-modules
を使用して、そのモジュールをアプリケーションに追加できます。今度は、これらのモジュールに、別のモジュールが必要になる場合があります。VMの初期化中に、この一連のモジュールの一貫性と完全性が検査されます。いずれかの時点でアプリケーションに必要となるすべてのモジュールが、VMの起動時に含まれていたモジュールの初期セットに含まれている必要があります。
JDK 11のOracle JVMも同様に機能します。すべてのjava.se
モジュールが、モジュールのルート・セットに自動的に含まれます。Oracle JVMセッションのmain
クラスはメソッドのクラスであり、Oracle JVMセッションを開始するデータベース・コールによって、そのJavaストアド・プロシージャが起動されます。このクラスがモジュールのメンバーである場合は、そのモジュールのルート・セットに追加されます。その他のモジュールは、次のいずれかの方法を使用して追加できます:
main
クラスがすでにロードされているときは、loadjava --add-modules
オプションを指定するoracle.aurora.addmods
システム・プロパティを指定する
oracle.aurora.addmods
システム・プロパティは、クライアントベースのjava --add-modules
コマンドライン引数を指定するのと同じ効果があります。別の方法として、loadjava -add-modules
コマンドライン引数を指定してmain
クラスをロードした場合は、oracle.aurora.addmods
プロパティのユーザーを指定する必要はありません。
クライアント側のJavaには、前述のモジュールで明示的に必要とされるすべてのモジュールも含まれています。前述のとおり、モジュールの最終セットの一貫性と完全性が、Oracle JVMセッションの起動時に検査されます。クライアント側のJavaでは、そのセッションの後続のデータベース・コールでコールされるモジュールを含む、Oracle Javaセッションのいずれかの時点で必要となるすべてのモジュールが、Oracle JVMセッションの起動時に含まれていたモジュールの初期セットのメンバーである必要があります。
1.3.3 GUI
サーバーではGUIは提供されませんが、GUIを動作させるロジックが提供されます。Oracle JVMでは、Java Abstract Window Toolkit (AWT)のヘッドレス・モードのみがサポートされます。サーバー上でGUIを実体化しようとしないかぎり、すべてのJava AWTクラスをサーバー環境で使用でき、プログラムでJava AWTの機能を利用できます。
関連トピック
1.3.4 IDE
Oracle JVMは、Javaアプリケーションの開発ではなく、デプロイメント指向です。アプリケーションの作成とテストは、Oracle JDeveloperなどの任意の統合開発環境(IDE)で行い、その後、クライアントによるアクセスおよび実行用にデータベース内にデプロイできます。
関連項目:
Javaのバイナリ互換性によって、任意のIDEで作成したJavaクラス・ファイルをサーバーにアップロードできます。Javaソース・ファイルをデータベースに移動する必要はありません。かわりに、強力なクライアント側のIDEを使用して、サーバー上にデプロイしたJavaアプリケーションをメンテナンスできます。
関連トピック