1.5 Oracle JVMの主要コンポーネント

この項では、Oracle JVMの主要コンポーネントおよびそれらが提供する機能の一部を簡単に説明します。

Oracle JVMは、Javaアプリケーションを実行するための、Java 2との完全互換の環境です。これは、そのメモリー・ヒープを共有し、リレーショナル・データに直接アクセスすることで、データベース・カーネルと同じプロセス領域およびアドレス領域で実行されます。この設計によりメモリーの使用を最適化して、スループットを向上させます。

Oracle JVMでは、Javaオブジェクト用のランタイム環境が提供されます。Javaのデータ構造、メソッド・ディスパッチ、例外処理および言語レベル・スレッドを完全にサポートします。また、java.langjava.iojava.netjava.mathおよびjava.utilなど、すべてのコアJavaクラス・ライブラリもサポートしています。

図1-8に、Oracle JVMの主要コンポーネントを示します。

図1-8 Oracle JVMの主要コンポーネント

図1-8の説明が続きます。
「図1-8 Oracle JVMの主要コンポーネント」の説明

Oracle JVMは、標準のJavaネームスペースをデータベース・スキーマに埋め込みます。この機能により、JavaプログラムはOracle Databaseに格納されたJavaオブジェクトおよび企業内のアプリケーション・サーバーにアクセスできます。

また、Oracle JVMは、データベースのスケーラブルな共有メモリー・アーキテクチャと緊密に統合されています。Javaプログラムは、ユーザーの介入なしで効率的にコール、セッションおよびオブジェクトの存続期間を使用します。この結果、Oracle JVMおよび中間層のJavaビジネス・オブジェクトは、それらが長く存続するセッションの場合でも適切に調整できます。

次の項では、Oracle JVMの一部のコンポーネント、およびJDBCドライバの概要について説明します:

1.5.1 ライブラリ・マネージャ

JavaクラスをOracle Databaseに格納するには、SQLのCREATE JAVA文を使用してその作業を実行する、loadjavaコマンドライン・ツールを使用します。CREATE JAVA {SOURCE | CLASS | RESOURCE}文によってコールされると、ライブラリ・マネージャはJavaのソース、クラスまたはリソース・ファイルをデータベースにロードします。これらのJavaスキーマ・オブジェクトは直接アクセスされることはなく、Oracle JVMのみが使用します。

1.5.2 コンパイラ

Oracle JVMには、標準のJavaコンパイラが組み込まれています。CREATE JAVA SOURCE文が実行されると、Javaコンパイラは、Javaソース・ファイルをバイトコードと呼ばれるアーキテクチャに依存しない1バイトの命令に変換します。各バイトコードは、命令コードとそれに続くオペランドで構成されています。結果として、Javaの標準に完全に準拠したJavaクラス・ファイルが生成され、実行時にインタプリタに送信されます。

1.5.3 インタプリタ

Javaプログラムを実行するために、Oracle JVMには標準Java 2のバイト・コード・インタプリタが組み込まれています。インタプリタとそれに関連するJavaランタイム・システムによって、標準のJavaクラス・ファイルが実行されます。ランタイム・システムでは、ネイティブ・メソッド、およびホスト環境からのコールとホスト環境へのコールがサポートされます。

ノート:

パフォーマンスを向上させるためにJavaコードをコンパイルすることもできます。Oracle JVMでは、ネイティブにコンパイルされたコアJavaクラス・ライブラリおよびJDBCドライバが使用されます。

1.5.4 クラス・ローダー

ランタイム・システムからの要求に応答して、Javaクラス・ローダーは、データベースに格納されているJavaクラスを検索、ロードおよび初期化します。クラス・ローダーはクラスを読み取り、そのクラスの実行に必要なデータ構造を生成します。不変のデータやメタデータは、初期化が1回の共有メモリーにロードされます。この結果、セッションごとに必要なメモリー量が低下します。クラス・ローダーは、必要に応じて外部参照を解決しようとします。また、ソース・ファイルが使用可能な場合、Javaクラス・ファイルを再コンパイルする必要があるときは、Javaコンパイラを自動的にコールします。

1.5.5 検証機能

Javaクラス・ファイルは、完全に移植可能で、明確に定義された形式に準拠しています。検証機能は、プログラム・フローを改ざんしたり、アクセス制限に違反する恐れのあるにせのJavaクラス・ファイルが誤って使用されるのを防止します。OracleのセキュリティとJavaのセキュリティが検証機能と連携することによって、ユーザーのアプリケーションとデータが保護されます。

1.5.6 サーバー側JDBC内部ドライバ

JDBCは標準であり、ベンダーに依存しないリレーショナル・データへのアクセスを提供するJavaクラスのセットを定義します。ODBCおよびX/Open SQL Call Level Interface(CLI)をモデルにしたJDBCクラスは、複数のデータベースへの同時接続、トランザクション管理、単純な問合せ、ストアド・プロシージャのコール、LONG型の列データへのストリーム形式のアクセスなどの標準的な機能を提供します。

特別にチューニングされたJDBCドライバは、下位レベルのエントリ・ポイントを使用してOracle Database内で直接実行され、Javaストアド・プロシージャからOracleデータへの高速アクセスを提供します。サーバー側JDBC内部ドライバは、標準のJDBC仕様に完全に準拠しています。JDBCドライバは、データベースと緊密に統合されているため、Oracle固有のデータ型、グローバリゼーション文字セットおよびストアド・プロシージャをサポートしています。また、クライアント側とサーバー側のJDBC APIが同じであるため、アプリケーションの分割を容易に行うことができます。

1.5.7 システム・クラス

Oracle Database環境でJava実装の重要な部分を構成するクラスのセットはシステム・クラスと呼ばれます。これらのクラスは、SYSスキーマで定義され、すべてのユーザーについてPUBLICシノニムごとにエクスポートされます。

JDK 11では、すべてのシステム・クラスがモジュールのメンバーです。各モジュールには、一連のパッケージが定義されています。モジュール・システムでは、名前付きモジュールと名前のないモジュールの間も含めて、個々のパッケージをモジュール間で分割できません。Oracle JVMでは、モジュール・パッチの適用もサポートされていません。そのため、システム・クラスの再定義は完全に禁止されています。

いずれかのシステム・クラスと同じ名前を持つクラスは、SYSスキーマ以外のスキーマで定義できます脚注1。ただし、その代替クラスが、他のシステム・クラスまたはJava仮想マシンの基本的な実装に存在する、そのクラスのセマンティクスの条件に違反して動作することがあるため、これは適切な操作ではありません。オラクル社では、この操作は絶対にお薦めしません。



脚注の説明

脚注1:

いずれかのシステム・クラスと同じ名前を持つクラスを常に定義できるわけではありません。java.langなどのクラスが一部のパッケージに存在する場合、このような定義はコードによって明示的に妨げられます。