• 検索結果がありません。

ツールツールツール

ドキュメント内 Oracle8i Java開発者ガイド, リリース8.1 (ページ 145-151)

ツール ツール ツール

JServer開発者のほぼすべてがloadjavaツールとdropjavaツールを使用しています。詳

細は、2-13ページの「Javaクラス・メソッドの実行準備」を参照してください。Oracle8iの Javaサポートに関する各マニュアル(『Oracle8i Javaストアド・プロシージャ開発者ガイ ド』、『Oracle8i SQLJ開発者ガイドおよびリファレンス』、『Oracle8i Enterprise JavaBeansと

CORBA開発者ガイド』、『Oracle8i JDBC開発者ガイドおよびリファレンス』および

『Oracle8i JPublisherユーザーズ・ガイド』)には、それぞれの領域でのロードに関する情報 が記載されています。

スキーマ・オブジェクトのツール

スキーマ・オブジェクトのツール スキーマ・オブジェクトのツール スキーマ・オブジェクトのツール スキーマ・オブジェクトのツール

従来のJava仮想マシンのコンパイルおよびロード対象はJavaファイルでしたが、Aurora Java仮想マシンのコンパイルおよびロード対象はスキーマ・オブジェクトです。次の3種類 のJavaスキーマ・オブジェクトがあります。

Javaクラス・スキーマ・オブジェクト(Javaのクラス・ファイルに相当します)

Javaソース・スキーマ・オブジェクト(Javaのソース・ファイルに相当します)

Javaリソース・スキーマ・オブジェクト(Javaのリソース・ファイルに相当します)

クラス・ファイルをAurora Java仮想マシンで実行するためには、loadjavaツールでクラ ス・ファイルまたはソース・ファイルからJavaクラス・スキーマ・オブジェクトを作成し、

スキーマにロードします。リソース・ファイルにAurora Java仮想マシンからアクセスでき るようにするには、loadjavaでリソース・ファイルからJavaリソース・スキーマ・オブ ジェクトを作成し、ロードします。

dropjavaツールは、loadjavaツールの逆の処理を行います。つまり、Javaファイルに対 応するスキーマ・オブジェクトを削除します。loadjavaで作成したJavaスキーマ・オブ ジェクトを削除するには、必ずdropjavaを使用します。SQL DDLコマンドで削除する と、loadjavaおよびdropjavaで管理される補助データが更新されません。

ロード内容とロード時期 ロード内容とロード時期 ロード内容とロード時期 ロード内容とロード時期

リソース・ファイルは必ずloadjavaでロードします。データベースの外で従来のコンパイ ラを用いて.classファイルを作成した場合は、ファイルをloadjavaでロードする必要 があります。別の方法でクラス・ファイルをロードするには、ソース・ファイルをロード し、このクラス・スキーマ・オブジェクトのコンパイルと管理をOracle8iシステムで行いま す。カレント・リリースのOracle8iでは、大半のコードをデータベースの外でコンパイルお よびデバッグをしてから、データベース内でのテストが必要な.classファイルのみをロー ドしてデバッグするという方法が最も生産性が高いとされています。1つのJavaクラスに対 して、.classファイルか.javaファイルのどちらか一方をロードできます。両方はロー ドできません。

loadjavaは、ソース・ファイルとリソース・ファイル、またはクラス・ファイルとリソー ス・ファイルから成るJARファイルを受け付けます(クラスのソース・ファイルとクラス・

ファイルは、どちらか一方のみをロードでき、両方はロードできないことを思い出してくだ さい)。loadjavaにJARファイルまたはZIPファイルを渡すと、loadjavaはアーカイブ を開き、その中のファイルを個別にロードします。JARまたはZIPスキーマ・オブジェクト は存在しません。ファイルの内容が前回のロード時から変更されていない場合は、再ロード されません。したがって、JARのロードによるパフォーマンス低下はほとんどありません。

JARファイルのロードは、最も簡単で安全なloadjavaの使用方法です。

同一スキーマ内の2つのスキーマ・オブジェクトで同じクラスを定義することはできませ ん。たとえば、a.javaでクラスxを定義し、xの定義をb.javaに移動しようとします。

a.javaがすでにロードされている場合は、loadjavaでb.javaをロードできません。

スキーマ・オブジェクトのツール

b.javaにも、xが定義されているためです。かわりに、次のどちらかの方法で操作する必 要があります。

a.javaを削除し、b.javaをロードします(b.javaにはxが定義されています)。次 に新しいa.javaをロードします(a.javaにはxが定義されていません)。

新しいa.javaをロードします(xが定義されていません)。次にb.javaをロードしま す(xが定義されています)。

参照の解決 参照の解決 参照の解決 参照の解決

すべてのJavaクラスに、他のクラスへの参照が含まれています。従来のJava仮想マシンは、

CLASSPATHで指定されたディレクトリ、ZIPファイルおよびJARでクラスを検索します。

一方、Aurora Java仮想マシンはスキーマでクラス・スキーマ・オブジェクトを検索します。

Oracle8iでは、クラスごとにリゾルバ仕様があります。これは、CLASSPATHに相当する

Oracle8iの機能です。サンプル・クラスalphaのリゾルバ仕様は、alphaで使用するクラ

スを検索するスキーマのリストです。リゾルバ仕様はクラスごとにあります。一方、従来の Java仮想マシンのCLASSPATHはすべてのクラスを対象にしたグローバルな仕様です。

クラス・スキーマ・オブジェクトごとに、リゾルバ仕様の他に、クラス間参照バインドのリ ストがあります。参照リストの各項目の内容は、別のクラスへの参照と、次のどちらかで す。

クラスで参照を使用するときにコールするクラス・スキーマ・オブジェクトの名前

参照を解決できないことを示すコード、つまり対象になっているスキーマ・オブジェク トが不明であることを示すコード

参照リストの管理は、Oracle8iの機能の1つであるリゾルバが行います。クラス内のクラス 間参照ごとに、リゾルバはクラスのリゾルバ仕様で指定されたスキーマで、参照を全て満た す有効なクラス・スキーマ・オブジェクトを検索します。すべての参照を解決すると、リゾ ルバはこのクラスを「有効」とマークします。解決を行っていないクラス、または解決でき なかったクラスは「無効」とマークされます。クラスが依存するスキーマ・オブジェクトが 無効になると、同時にクラスも無効とマークされます。つまり、無効化はクラスからこのク ラスを使用しているクラス群、このクラス群を使用しているクラス群というように、上方に 連鎖します。無効なクラスに依存するクラスを解決するとき、リゾルバは最初に依存関係を 解決しようとします。解決処理が行われていないために、無効とマークされていることもあ るからです。有効とマークされているクラスは、再び解決しません。

クラスの開発者は、loadjavaでクラスを解決することも、実行時まで延期することもでき ます。無効とマークされているクラスを別のクラスでロードしようとすると、自動的にリゾ ルバが実行されます。実行時以前に解決すると、足りないクラスを早期に見つけることがで きます。実行時に解決できないと、"class not found"例外になります。また、クラスのツ リーが大きすぎると、データベース・リソースの不足のために、実行時に解決できないこと があります。

loadjavaには2つの解決モードがあります。

スキーマ・オブジェクトのツール

1. Load-and-resolve(-resolveオプション):コマンドラインで指定されたすべてのクラ

スをロードし、無効とマークしてから、解決します。相互に参照しているクラス群を初 めてロードするときは、このモードを使用します。孤立したクラスを再ロードするとき も、通常このモードを使用します。このモードでは、すべてのクラスをロードしてから 解決するので、クラスの参照先クラスがコマンド実行時の後半にロードされる場合で も、エラーを避けることができます。

2. Load-then-resolve(no-resolveオプション):実行時にコンパイルされると各クラス

を解決します。

すべてのクラスのロードが完了するまで、解決を延期することをお薦めします。これによ り、使用するクラスがロードされていないために、リゾルバがそのクラスを無効とマークす るのを回避できます。

ダイジェスト表 ダイジェスト表 ダイジェスト表 ダイジェスト表

スキーマ・オブジェクトのダイジェスト表による最適化は、開発者には通常表示されませ ん。loadjavaは、ダイジェスト表に基づき、前回のロード時から変更されていないファイ ルをスキップします。一部のファイルのみの再ロードが必要な場合は、この機能によって loadjavaを起動するスクリプトおよびMakeファイルのパフォーマンスを向上できます。

再ロードするアーカイブ・ファイルには、前回のロード時から変更されているファイルと変 更されていないファイルが混在していることがあるためです。

loadjavaツールは、未変更ファイルを検出するために、各スキーマのダイジェスト表を管 理しています。ダイジェスト表によって、ファイル名がダイジェスト、つまりファイル内容 の短縮表現(ハッシュ)に対応付けられます。作成時期が異なる同一ファイルのダイジェス トを比較することによって、ファイル内の各バイトを比較するよりはるかに高速に、ファイ ル内容の変更を検出できます。処理対象のファイルごとに、loadjavaはファイル内容のダ イジェストを作成してから、ダイジェスト表をルックアップしてファイル名を探します。ダ イジェスト表に同じダイジェストのファイル名エントリがあると、loadjavaはそのファイ ルをロードしません。そのスキーマ・オブジェクトの最新版が存在するためです。

-verboseオプションでloadjavaを起動すると、ダイジェスト表のルックアップ結果が 表示されます。

通常、ダイジェスト表は開発者には表示されません。スキーマ・オブジェクトの追加、変更 および削除は、loadjavaとdropjavaによってダイジェスト表に同期化されるためです。

したがって、loadjavaで作成したスキーマ・オブジェクトは、必ずdropjavaで削除し てください。スキーマ・オブジェクトをDDLで削除しないでください。ダイジェスト表が 壊れた場合、つまりファイルが変更されているスキーマ・オブジェクトをloadjavaが更新 しなかった場合は、loadjavaの-forceオプションでダイジェスト表のルックアップを回 避します。

注意 注意注意

注意: Javaコンパイラと同様、loadjavaは、クラスへの参照を解決し ますが、リソースへの参照は解決しません。したがって、クラスに必要な リソース・ファイルを正しくロードする必要があります。

ドキュメント内 Oracle8i Java開発者ガイド, リリース8.1 (ページ 145-151)