1.5 Oracle JVMの主要コンポーネント
この項では、Oracle JVMの主要コンポーネントおよびそれらが提供する機能の一部を簡単に説明します。
Oracle JVMは、Javaアプリケーションを実行するための、Java 2との完全互換の環境です。これは、そのメモリー・ヒープを共有し、リレーショナル・データに直接アクセスすることで、データベース・カーネルと同じプロセス領域およびアドレス領域で実行されます。この設計によりメモリーの使用を最適化して、スループットを向上させます。
Oracle JVMでは、Javaオブジェクト用のランタイム環境が提供されます。Javaのデータ構造、メソッド・ディスパッチ、例外処理および言語レベル・スレッドを完全にサポートします。また、java.lang
、java.io
、java.net
、java.math
およびjava.util
など、すべてのコアJavaクラス・ライブラリもサポートしています。
図1-8に、Oracle JVMの主要コンポーネントを示します。
Oracle JVMは、標準のJavaネームスペースをデータベース・スキーマに埋め込みます。この機能により、JavaプログラムはOracle Databaseに格納されたJavaオブジェクトおよび企業内のアプリケーション・サーバーにアクセスできます。
また、Oracle JVMは、データベースのスケーラブルな共有メモリー・アーキテクチャと緊密に統合されています。Javaプログラムは、ユーザーの介入なしで効率的にコール、セッションおよびオブジェクトの存続期間を使用します。この結果、Oracle JVMおよび中間層のJavaビジネス・オブジェクトは、それらが長く存続するセッションの場合でも適切に調整できます。
次の項では、Oracle JVMの一部のコンポーネント、およびJDBCドライバとSQLJトランスレータの概要について説明します。
1.5.1 ライブラリ・マネージャ
JavaクラスをOracle Databaseに格納するには、SQLのCREATE JAVA
文を使用してその作業を実行する、loadjava
コマンドライン・ツールを使用します。CREATE JAVA {SOURCE | CLASS | RESOURCE}
文によってコールされると、ライブラリ・マネージャはJavaのソース、クラスまたはリソース・ファイルをデータベースにロードします。これらのJavaスキーマ・オブジェクトは直接アクセスされることはなく、Oracle JVMのみが使用します。
1.5.3 インタプリタ
Javaプログラムを実行するために、Oracle JVMには標準Java 2のバイトコード・インタプリタが組み込まれています。インタプリタとそれに関連するJavaランタイム・システムによって、標準のJavaクラス・ファイルが実行されます。ランタイム・システムでは、ネイティブ・メソッド、およびホスト環境からのコールとホスト環境へのコールがサポートされます。
ノート:
パフォーマンスを向上させるためにJavaコードをコンパイルすることもできます。Oracle JVMでは、ネイティブにコンパイルされたコアなJavaクラス・ライブラリ、SQLJトランスレータおよび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 サーバー側SQLJトランスレータ
SQLJを使用すると、SQL文をJavaプログラムに埋め込むことができます。これはJDBCよりも簡潔であり、静的な分析と型チェックに対してすぐに応答できるようになります。それ自体がJavaプログラムであるSQLJプリプロセッサは、SQLJ句が埋め込まれているJavaソース・ファイルを入力として取得します。次に、SQLJ句を、指定したSQL文を実装するJavaクラス定義に変換します。Java型システムによって、これらのクラスのオブジェクトは正しい引数でコールされることが保証されます。
高度に最適化されたSQLJトランスレータはデータベース内で直接実行され、サーバー側JDBC内部ドライバを使用して、Oracleデータへのランタイム・アクセスを提供します。SQLJフォームには、問合せ、データ操作言語(DML)文、データ定義言語(DDL)文、トランザクション制御文、およびストアド・プロシージャのコールを組み込むことができます。クライアント側とサーバー側のSQLJ APIが同じであるため、アプリケーションの分割を容易に行うことができます。
1.5.8 システム・クラス
Oracle Database環境でJava実装の重要な部分を構成するクラスのセットはシステム・クラスと呼ばれます。これらのクラスは、SYS
スキーマで定義され、すべてのユーザーについてPUBLICシノニムごとにエクスポートされます。いずれかのシステム・クラスと同じ名前を持つクラスは、SYS
スキーマ以外のスキーマで定義できます脚注1。ただし、その代替クラスが、他のシステム・クラスまたはJava仮想マシンの基本的な実装に存在する、そのクラスのセマンティクスの条件に違反して動作することがあるため、これは適切な操作ではありません。オラクル社では、この操作は絶対にお薦めしません。
脚注の説明
脚注1:いずれかのシステム・クラスと同じ名前を持つクラスを常に定義できるわけではありません。java.lang
などのクラスが一部のパッケージに存在する場合、このような定義はコードによって明示的に妨げられます。