Oracle Databaseでは、Javaアプリケーションの開発、格納およびデプロイがサポートされています。この章では、SQLデータと統合されたサーバー側アプリケーションの開発に習熟しているOracle PL/SQLの開発者を対象として、Java言語について説明します。これらの開発者は、Oracle Databaseのスケーラビリティおよびパフォーマンスを利用したJavaのサーバー側アプリケーションを開発できます。
この章の内容は、次のとおりです。
Javaは、優れたオブジェクト指向プログラミング言語として登場しました。Javaの重要な概念は次のとおりです。
このような概念から、オブジェクト指向で、アプリケーション・プログラムを効率的に作成できる言語であるJavaが開発されました。
この項の内容は、次のとおりです。
次の用語は、Oracle Database環境におけるJavaアプリケーション開発でよく使用される用語です。
クラスの概念は、どのオブジェクト指向プログラミング言語でもサポートされています。表定義のように、クラスでは、共通の特性を持つオブジェクトのテンプレートが提供されます。各クラスで、次の項目を定義できます。
フィールドは、特定クラスの各オブジェクト(インスタンス)に存在する変数、または、グローバルですべてのインスタンスに共通な変数です。インスタンスのフィールドは、リレーショナル表の行の列に類似しています。クラスによって、フィールドと各フィールドの型が定義されます。
Javaでは、フィールドをstaticとして宣言できます。staticとして宣言されたクラスのフィールドはグローバルであり、そのクラスのすべてのインスタンスに共通です。Javaランタイムの特定のインスタンス内の静的フィールドに対して、特定の時点の値は1つのみです。staticとして宣言されないフィールドは、そのクラスの各インスタンス内で個別の値として作成されます。
public
、private
、protected
およびデフォルト・アクセス修飾子では、アプリケーションのフィールドの範囲が定義されます。Java言語仕様(JLS)では、すべてのフィールドに対するデータの可視性規則が定義されます。可視性規則では、これらのフィールド内のデータにどのような場合にアクセスできるかが定義されます。
図1-1の例では、従業員識別子がprivate
として定義されており、これは、他のオブジェクトがこのフィールドに直接アクセスできないことを示しています。この例で、オブジェクトがid
フィールドにアクセスするには、getId()
メソッドをコールします。
メソッドは、クラスに関連付けられたプロシージャです。フィールドと同様に、メソッドをstatic
として宣言でき、この場合、グローバルにコールできます。メソッドをstaticとして宣言しない場合、そのメソッドはインスタンス・メソッドで、オブジェクトがクラスのインスタンスである場合のオブジェクト上の操作としてのみコールできることを示しています。
フィールドと同様に、メソッドは、public
、private
、protected
またはデフォルト・アクセスとして宣言できます。この宣言では、メソッドをコールできる範囲が定義されます。
Javaオブジェクトはクラスのインスタンスであり、リレーショナル表の行に類似しています。オブジェクトはデータ値の集まりで、クラスの非静的フィールド定義によって記述される個々の要素です。
図1-1に、2つのフィールドid
(従業員識別子)とlastName
(従業員の姓)、およびgetId()
メソッドとsetId(String anId)
メソッドで定義されているEmployee
クラスの例を示します。id
フィールドはprivate
であり、lastName
フィールド、getId()
メソッドおよびsetId(String anId)
メソッドはpublic
です。
インスタンスを作成すると、フィールドには、ある従業員にのみ関係する個人のプライベートな情報が格納されます。つまり、1つの従業員インスタンスに含まれる情報は、該当する特定の従業員のみが認識しています。図1-1の例は、Employee
クラスの2つのインスタンスを示しており、1つは従業員Smith用、もう1つはJones用です。各インスタンスには、個々の従業員に関連する情報が含まれています。
継承は、オブジェクト指向プログラミング言語の重要な機能です。これによって、クラスは他のクラスのプロパティを含めることができます。プロパティを継承するクラスは子クラスまたはサブクラスと呼ばれ、プロパティの継承元のクラスは親クラスまたはスーパークラスと呼ばれます。この機能は、定義済コードの再利用にも役立ちます。
図1-1の例では、Employee
クラスのプロパティを継承するFullTimeEmployee
クラスを作成できます。継承されるプロパティは、スーパークラスの各フィールドおよびメソッドに対して宣言されている接続修飾子によって決まります。
Javaでは単一の継承のみがサポートされ、つまり、各クラスは、1つのクラスからのみフィールドおよびメソッドを継承できます。複数のソースからプロパティを継承する必要がある場合、Javaは複数継承の形式のインタフェースの概念を提供します。インタフェースはクラスに類似しています。ただし、メソッドのシグネチャのみが定義され、実装は定義されません。インタフェースで宣言されたメソッドはクラスで実装されます。1つのクラスで複数のインタフェースを実装すると、複数継承が行われます。
カプセル化は、データとメソッドを他から隠すオブジェクトの機能を示し、オブジェクト指向プログラミングの基本原理の1つです。Javaでは、クラスによって、フィールド(オブジェクトの状態を格納)およびメソッド(オブジェクトのアクションを定義)がカプセル化されます。カプセル化によって、再利用可能なプログラムを作成できます。また、public
と宣言されたオブジェクトの機能にのみアクセスを制限することもできます。その他のすべてのフィールドおよびメソッドはprivate
であり、内部的なオブジェクト処理に使用できます。
図1-1の例では、id
フィールドがprivate
であり、これへのアクセスは、それを定義しているオブジェクトに制限されます。他のオブジェクトがこのフィールドにアクセスするには、getId()
メソッドを使用します。カプセル化を使用すると、getId()
メソッドをprivate
として宣言するか、またはgetId()
メソッドを定義しないことによって、id
フィールドへのアクセスを拒否できます。
ポリモフィズムは、異なるオブジェクトが同じメッセージに対してそれぞれ異なる応答をするための機能です。オブジェクト指向プログラミング言語では、1つ以上のメソッドを同じ名称で定義できます。これらのメソッドは異なるアクションを実行し、異なる値を戻すことができます。
図1-1の例で、各種の従業員がそれぞれの給与累計で応答できるようにする必要があるとします。給与は、従業員の種類ごとに異なる方法で計算されます。
フルタイム従業員は賞与の支払対象です。
適用対象従業員は時間外手当の支払対象です。
手続き型言語では、考えられるケースをそれぞれ定義して、次のようなswitch
文を記述します。
switch: (employee.type) { case: Employee return employee.salaryToDate; case: FullTimeEmployee return employee.salaryToDate + employee.bonusToDate ... }
新しい種類の従業員を追加する場合は、switch
文を更新する必要があります。また、データ構造を変更する場合は、その構造を使用するswitch
文をすべて変更する必要があります。Javaなどのオブジェクト指向言語では、Employee
クラスで定義されていない情報がサブクラスに含まれている場合、Employee
クラスのサブクラスごとにメソッドcompensationToDate()
を実装できます。たとえば、適用対象従業員のcompensationToDate()
メソッドを次のように実装します。
public float compensationToDate() { return (super.compensationToDate() + this.overtimeToDate()); }
フルタイム従業員の場合は、compensationToDate()
メソッドを次のように実装できます。
public float compensationToDate() { return (super.compensationToDate() + this.bonusToDate()); }
メソッド名を共通して使用することで、従業員の種類を指定しなくても、異なるクラスのメソッドをコールして、結果を取得できます。フルタイム従業員とパートタイム従業員を処理するために特別なメソッドを記述する必要はありません。
また、Employee
からプロパティを継承しないContractor
クラスを作成し、このクラスにcompensationToDate()
メソッドを実装することもできます。給与累計の合計を計算するプログラムは、フルタイム、パートタイム、契約社員のいずれであるかに関係なく給与計算時に全従業員に対して反復処理し、従業員ごとにcompensationToDate()
メソッドをコールして戻された値を合算します。メソッドのコール元が正常に動作することを認識した上で、個々のcompensationToDate()
メソッドまたはクラスを安全に変更できます。
Java言語には、サーバー・アプリケーションの開発に最適な機能がいくつかあります。次の機能があります。
簡潔性
Javaでは、オブジェクト・モデルが一貫して規定されているため、サーバー・アプリケーションの作成で使用される他のほとんどの言語より単純です。大規模なクラス・ライブラリの標準セットは、あらゆるプラットフォームのJava開発者が強力なツールとして使用できます。
移植性
Javaはプラットフォーム間で移植可能です。Javaでは、プラットフォームに依存するコードを記述でき、複数のシステム間でシームレスに移植するプログラムも容易に作成できます。
自動記憶域管理
JVMでは、プログラムの実行中にすべてのメモリー割当てと割当て解除が自動的に実行されます。Javaプログラマは、新規オブジェクトに対するメモリーの割当てや、参照されなくなったオブジェクトに対するメモリーの解放を明示的に行うことはできません。かわりに、これらの操作はJVMに依存して実行されます。メモリーの解放処理は、ガベージ・コレクションと呼ばれます。
強い型指定
フィールドを使用するには、そのフィールドの型を宣言する必要があります。Javaの強い型指定によって、JavaアプリケーションとPL/SQLアプリケーション間における言語間のコールに対する適切で安全なソリューションが提供され、JavaコールとSQLコールが同じアプリケーション内に統合されます。
ポインタの不使用
Javaの構文はC言語に類似していますが、ダイレクト・ポインタやポインタ操作はサポートされていません。プリミティブ型以外のすべてのパラメータは、値ではなく参照で渡します。この結果、オブジェクト識別性が保持されます。Javaでは、ポインタへの低水準の直接アクセスはサポートされていないため、メモリーの破損やリークを防ぐことができます。
例外処理
Java例外はオブジェクトです。Javaでは、開発者が、特定のクラスでメソッドによってスローされる例外を宣言する必要があります。
柔軟なネームスペース
Javaでは、クラスが定義され、そのクラスがインターネットのドメインのネームスペースを模倣した階層構造に格納されます。Javaアプリケーションは分散でき、名前の衝突を回避できます。Java Naming and Directory Interface(JNDI)などのJava拡張機能によって、複数のネーム・サービスを統合するためのフレームワークが提供されます。Javaのネームスペース・アプローチは非常に柔軟であるため、Oracleは、JLSに完全に準拠して、クラス名を解決するスキーマの概念を組み込むことができます。
セキュリティ
JavaバイトコードとJVM仕様の設計によって、Javaバイナリ・コードのセキュリティを組込みメカニズムで検証できます。Oracle DatabaseとともにインストールされるSecurityManagerのインスタンスでは、Oracle Databaseのセキュリティと組み合せることによって、Javaメソッドをコールできるユーザーが判断されます。
リレーショナル・データベースへの接続性の標準
Java Database Connectivity(JDBC)およびSQLJを使用すると、Javaコードで、リレーショナル・データベース内のデータに対するアクセスおよび操作ができます。Oracleには、ベンダーに依存しない移植性のあるJavaコードでリレーショナル・データベースにアクセスできるようにするドライバが用意されています。
Javaソースは、他の高水準のコンピュータ言語と同様に、低水準のマシン命令にコンパイルされます。各命令サイズが一律に1バイトであるため、Javaでは、これらの命令はバイトコードと呼ばれています。Cなど他のほとんどの言語は、IntelまたはHPプロセッサに固有の命令など、マシン固有の命令にコンパイルされます。
コンパイル時に、Javaコードは、Java仮想マシン(JVM)によって実行される、プラットフォームに依存しない標準のバイトコード・セットに変換されます。JVMは、Javaコードを実行する特定のプラットフォーム用に最適化された個別のプログラムです。
図1-2に、プラットフォームの独立性が、Javaによってどのように保持されるかを示します。各プラットフォームには、オペレーティング・システムに固有のJVMがインストールされています。Javaバイトコードは、JVMを介して、プラットフォームに依存する適切な処理へと解析されます。
Javaアプリケーションの開発では、Java言語で記述された事前定義のコア・クラス・ライブラリを使用します。Javaコア・クラス・ライブラリは、一般的な機能を提供する各パッケージに論理的に分割されています。基本言語のサポートはjava.lang
パッケージによって、I/Oサポートはjava.io
パッケージによって、ネットワーク・アクセスはjava.net
パッケージによってそれぞれ提供されます。JVMとコア・クラス・ライブラリによって提供されるプラットフォームでは、Javaプログラマは、Javaをサポートするすべてのオペレーティング・システムで正常に実行されるアプリケーションを開発できます。この概念は、「1回作成すれば、どこでも実行可能(write once, run anywhere)」というJavaの考え方を推進するものです。
図1-3は、OracleのJavaアプリケーションがJavaコア・クラス・ライブラリの上部に位置し、Javaコア・クラス・ライブラリがJVMの上部に位置していることを示しています。OracleのJavaサポート・システムはデータベース内に配置されているため、JVMはオペレーティング・システムと直接対話するかわりに、Oracle Databaseライブラリと対話します。
JavaおよびJVMの詳細は、Java言語仕様(JLS)およびJVM仕様を参照してください。JLSで構文やセマンティクスが定義され、JVM仕様では、アプリケーションを実行するシステムに必要な下位レベルのアクションが定義されます。さらに、JVM実装には、VMの実装者が仕様に従ってコンパイルしたかどうかを判断するための互換性テスト一式があります。このテスト一式は、Java Compatibility Kit(JCK)と呼ばれます。Oracle JVM実装は、JCKに完全に準拠しています。総合的なJava方針の一環として、公に規定された標準と、その標準への準拠を検証する簡単な方法によって、ベンダーはすべてのプラットフォームでJavaのサポートを統一できます。
Javaでは、クラスは大規模なクラス階層内で定義されます。階層の最上部にObject
クラスがあります。Javaのすべてのクラスは、スーパークラスの継承連鎖内をさかのぼる過程で、あるレベルのObject
クラスを継承しています。クラスBがクラスAを継承している場合、クラスBの各インスタンスには、クラスBに定義されたすべてのフィールドとクラスAに定義されたすべてのフィールドが含まれます。
図1-4は、一般的なJavaのクラス階層を示しています。FullTimeEmployee
クラスには、Employee
クラスで定義されたid
フィールドおよびlastName
フィールドがあります。これは、Employee
クラスから継承されているためです。また、FullTimeEmployee
クラスでは、FullTimeEmployee
にのみ含まれる別のフィールドbonus
が追加されます。
クラスBのインスタンスでは、クラスAまたはクラスBのいずれかで定義された任意のメソッドをコールできます。例では、FullTimeEmployee
インスタンスでコールできるメソッドは、FullTimeEmployee
でのみ定義されたメソッド、およびEmployee
クラスで定義されたメソッドです。
クラスBのインスタンスは、クラスAのインスタンスのかわりに使用でき、継承は、コードの再利用性を改善するための、オブジェクト指向言語の別の強力な構成となります。動作と状態を定義するクラスを、階層内の適切な場所、しかもクラス・ライブラリの既存の機能を利用できる場所に作成できます。
Javaは豊富なセキュリティ機能を備えた安全な言語であるため、データベースでJavaアプリケーションを作成およびロードできます。Javaは、Javaコードが格納されているオペレーティング・システムの改ざんを防止するように開発されています。Cなど、一部の言語では、データベースにセキュリティ上の問題が発生する可能性があります。これに対してJavaは、その設計により、データベース内の使用にも堅牢な言語です。
Java言語は開発者にとって多数の利点がありますが、Javaサーバー・アプリケーションをサポートするJVMをスケーラブルな方法で実装するのは容易ではありません。この項では、次の問題について説明します。
Oracle Databaseでは、Javaアプリケーションに対して、複合問合せの実行や同一データの異なるビューでの表示をサポートする動的なデータ処理エンジンが提供されます。クライアントからの要求はすべてデータ問合せとして構成されて即時処理され、問合せ結果がすぐに生成されます。
JavaとOracle Databaseを組み合せることによって、ビジネス・ニーズの変化に応じて簡単に更新できるコンポーネントベースでネットワーク中心のアプリケーションを作成できます。また、アプリケーションおよびデータ・ストアを、デスクトップからインテリジェント・ネットワークやネットワーク型のサーバーに移動できます。さらに重要なのは、これらのアプリケーションおよびデータ・ストアに任意のクライアント・デバイスからアクセスできることです。
図1-5に、従来の2層クライアント/サーバー構成を示します。この構成では、クライアントは、PL/SQLストアド・プロシージャのコールと同様の方法でJavaストアド・プロシージャをコールします。また、この図では、Oracle Net Services Connection Managerが、多数のネットワーク接続を単一のデータベース接続に結合する方法も示されています。このようにして、Oracle Databaseでは多数の同時ユーザーがサポートされます。
マルチスレッドは、Java言語の主要なスケーラビリティ機能の1つです。Java言語とクラス・ライブラリによって、他の多くの言語に比べてマルチスレッド・アプリケーションをJavaで簡単に作成できますが、依然としてどのような言語でも、信頼性が高くスケーラブルなマルチスレッド・コードを記述するのは困難な作業です。
Oracle Databaseサーバーは、多数のユーザーの作業を効率的にスケジュールします。Oracle JVMはOracle Databaseのセッション・アーキテクチャを利用して、多数のユーザーのJavaアプリケーションを同時に実行します。Oracle DatabaseではJLSとJCKに必要なJava言語レベルのスレッドがサポートされていますが、データベースの有効範囲内でスレッドを使用するとスケーラビリティは向上しません。データベースの埋込みのスケーラビリティを使用すると、マルチスレッドJavaサーバーを記述する必要がなくなります。
ユーザーのスケジューリングには、シングル・スレッドJavaアプリケーションを作成してOracle Databaseの機能を使用してください。データベースが各アプリケーション間の処理をスケジューリングするため、スレッドを管理しなくてもスケーラビリティが実現します。また、マルチスレッドJavaアプリケーションの作成も可能ですが、複数のJavaスレッドを使用してもサーバーのパフォーマンスは向上しません。
マルチスレッドで生じる問題の1つは、スレッドと自動記憶域管理またはガベージ・コレクションとの間の相互作用です。汎用JVMで実行されるガベージ・コレクタでは、どのJava言語スレッドが実行されているか、または基盤となるオペレーティング・システムでどのようにスケジュールされているかは認識されません。非Oracle DatabaseモデルとOracle JVMモデルの相違点は、次のとおりです。
非Oracle Databaseモデル
単一のユーザーが単一のJavaスレッドにマップされ、単一のガベージ・コレクタによって全ユーザーからのガベージがすべて管理されます。通常、存続期間やサイズの異なるオブジェクトの割当てと回収は、異なる技法で処理されます。アプリケーションが過度にマルチスレッド化されると、少なくともネイティブ・スレッド用のオペレーティング・システム・サポートに依存するようになるため、信頼性が低下したり、スケーラビリティが限定される可能性があります。この種の実装の場合、高水準のスケーラビリティは十分に実証されていません。
Oracle JVMモデル
多数のユーザーがサーバーに接続して同じJavaコードを実行する場合も、各ユーザーは各自のJVMで独自のJavaコードを実行しているように感じます。Oracle JVMの役割は、オペレーティング・システムのプロセスとスレッド、およびOracle Databaseのスケーラブルなアプローチを利用することです。このアプローチによって、一度に複数のユーザーからガベージが収集されることがなくなるため、Oracle JVMのガベージ・コレクタの信頼性と効率が向上します。
ガベージ・コレクションはJavaの自動記憶域管理機能の主要な機能であり、Java開発者はメモリーの割当てと解放を明示的に行う必要がなくなります。そのため、CやC++のプログラムで一般に検出されるメモリー・リークの大きな原因がなくなります。ただし、ガベージ・コレクションはプログラムの実行スピードとフットプリントのオーバーヘッドに影響を与えます。
ガベージ・コレクションは、高スケーラブルで高速なJavaプラットフォームを提供しようとするJVM開発者に対する1つの課題です。Oracle JVMは、このような課題に次の方法で対応します。
Oracle JVMでは、複数のユーザーを効率的に管理できるOracle Databaseのスケジューリング機能が使用されます。
ガベージ・コレクションは単一セッション内の単一ユーザーを対象とするため、複数ユーザーに対しても一貫して実行されます。Oracle JVMの場合、ユーザー数が増加してもメモリー・マネージャの作業の負荷や複雑さは変わらないため、その点において有利です。メモリー・マネージャは単一セッション内でオブジェクトの割当てと回収を実行し、通常はこれが単一ユーザーのアクティビティに変換されます。
Oracle JVMでは、使用するメモリーのタイプに応じて異なるガベージ・コレクションの技法が使用されます。これらの技法によって、効率が向上し、オーバーヘッドが低減します。
2種類のメモリー領域は、コール領域とセッション領域です。
メモリー領域 | 説明 |
---|---|
コール領域 | 高速でコストの低いメモリーです。主にコール期間中に存在します。コール・メモリー領域は新規セグメントと旧セグメントに分割されます。新規オブジェクトはすべて新規メモリー内に作成されます。数回のスキャベンジ後も存在し続けているオブジェクトは、旧メモリーに移動されます。 |
セッション領域 | コストの高いパフォーマンス重視のメモリーです。主にセッション期間中に存在します。コール存続期間より長い期間存在するすべてのstatic フィールドとオブジェクトは、この領域に存在します。 |
図1-6は、ガベージ・コレクタによって実行される様々なアクションを示しています。
Oracle JVM内のガベージ・コレクション・アルゴリズムは、次のルールを遵守します。
新規オブジェクトは新規コール領域内に作成されます。
スキャベンジは既定の間隔で行われます。プログラマによっては、オブジェクトを短期間のみ頻繁に作成する場合があります。このようなタイプのオブジェクトは、新規コール領域内に作成され、すぐにガベージ・コレクションされます。これはスキャベンジと呼ばれます。
スキャベンジを数回繰り返した後も存在し続けているオブジェクトは、しばらくの間存在する可能性のあるオブジェクトとみなされます。これらのオブジェクトは、新規コール領域から旧コール領域に移動されます。移動中にも圧縮が行われます。旧コール領域はスキャベンジ(ガベージ・コレクション)される回数が少ないため、パフォーマンスが向上します。
コール終了時に、コール後も存在するオブジェクトはセッション領域に移動されます。
図1-6は、前述の説明の手順を示しています。このアプローチでは、オブジェクトの種類や存続期間にあわせて、効率的な割当と回収の仕組みが適用されます。たとえば、新規オブジェクトは、迅速な割当とアクセスを目的として設計された、高速でコストの低いコール・メモリーに割り当てられます。Java static
フィールドで保持されるオブジェクトは、より貴重でコストの高いセッション領域に移行されます。
Javaプログラムの実行によるフットプリントは、次の様々な要因の影響を受けます。
プログラムのサイズ
プログラムのサイズは、クラス数、メソッド数およびそれらのコードの量によって決まります。
プログラムの複雑さ
プログラムの複雑さは、プログラム自体ではなく、プログラムの実行時にOracle JVMで使用されるコア・クラス・ライブラリの数によって決まります。
JVMが使用する領域の量
JVMが使用する領域の量は、JVMが割り当てるオブジェクトの数とサイズ、および複数コール間で保持する必要のあるオブジェクトの数によって決まります。
ガベージ・コレクタとメモリー・マネージャが、プログラムの実行の要求を処理する能力
ほとんどの場合、この能力は決定要因ではありません。オブジェクトの割当て速度および他のオブジェクトによって保持される方法が、この要因の重要度に影響を与えます。
スケーラビリティの観点から、複数のクライアントを同時にサポートするには、ユーザー当たりのセッション・フットプリントを最小限に抑えることが重要です。Oracle JVMでは、Javaバイトコードなど、ユーザー用のすべての読取り専用データを共有メモリーに格納することで、ユーザー当たりのセッション・フットプリントを最小限に抑えます。ユーザー・セッションのフットプリントが大きくならないように、コールとセッションのメモリーに対して、適切なガベージ・コレクション・アルゴリズムが適用されます。Oracle JVMでは、ユーザーのセッション・メモリーのメンテナンスに、次の種類のガベージ・コレクション・アルゴリズムが使用されます。
ジェネレーション・スキャベンジ: 存続期間の短いオブジェクトの場合
マーク/レイジー・スイープ・コレクション: 単一コールの間に存在するオブジェクトの場合
コレクタのコピー: 存続期間の長いオブジェクト、つまり、セッション内の複数コールにわたって存在するオブジェクトの場合
Oracle JVMのパフォーマンスは、標準のHotSpotと同様に革新的なJust-In-Timeコンパイラを組み込むことによって向上します。プラットフォームに依存しないJavaバイトコードはJVMの上部で実行され、そのJVMは特定のハードウェア・プラットフォームと対話します。ソフトウェア内でレベルを追加すると、パフォーマンスが低下します。Javaでは、バイトコードを解析するために仲介部分を通過する必要があるため、Javaアプリケーションには、C言語のようなプラットフォームに依存する言語を使用して開発されたアプリケーションと比較して、ある程度の非効率性が伴います。この問題に対処するために、複数のJVMサプライヤがネイティブ・コンパイラを作成しています。ネイティブ・コンパイラによって、Javaバイトコードはプラットフォームに依存するネイティブ・コードに変換され、その結果、インタプリタのステップが不要になり、パフォーマンスが向上します。
コンパイラ | 説明 |
---|---|
Just-In-Time(JIT)コンパイル | JITコンパイラは、実行時にJavaバイトコードをプラットフォーム固有(ネイティブ)のマシン・コードに迅速にコンパイルします。これらのコンパイラでは、プラットフォームで実行される実行可能ファイルは生成されません。かわりに、変換後に直接実行されるプラットフォームに依存するコードがJavaバイトコードから作成されます。JITコンパイラは、頻繁に実行され、Cなどの他言語で開発されたコードとほぼ同じ速度で実行されるJavaコードに対して使用してください。 |
Ahead-of-Timeコンパイル | このコンパイルでは、実行前にJavaバイトコードがプラットフォームに依存しないCコードに変換されます。次に、標準的なCコンパイラで、Cコードがターゲット・プラットフォーム用の実行可能ファイルにコンパイルされます。この方法は、あまり変更されないJavaアプリケーションに適しています。この方法は、最近のCコンパイラで採用されている成熟した効率的なプラットフォーム固有のコンパイル技術を利用しています。 |
Oracle Databaseは、Just-In-Time (JIT)コンパイルを使用して、JDBCコードなどのコアなJavaクラス・ライブラリをネイティブにコンパイル済の形式で配布しています。JITコンパイラは、プラグインのサポートがなくても有効で、これは、Oracleがサポートしているすべてのプラットフォームで適用できます。
図1-7に示すように、ネイティブにコンパイルされたコードは、解析されるコードに比較して最高で10倍速く実行されます。この結果、プログラムで使用するネイティブ・コードが多いほど、実行速度が速くなります。
Javaのもう1つの強力な機能は、動的クラス・ロードです。クラス・ローダーは、クラスをディスクからロードし、解析に必要なJVM固有のメモリー構造に格納します。また、クラスをCLASSPATH
内で検索し、プログラムの実行中に使用される場合にのみロードします。この方法はアプレットに適していますが、サーバー環境では次の問題があります。
問題 | 説明 | 解決策 |
---|---|---|
予測可能性 | クラス・ロード操作は、プログラムの初回実行時に重大なペナルティを伴います。単純なプログラムの場合でも、Oracle JVMによって、そのニーズをサポートするための多数のコア・クラスがロードされる可能性があります。ロードされるクラスの数は、プログラマが簡単に予測または判断することはできません。 | Oracle JVMは、他のJVMと同様に、クラスを動的にロードします。1回のクラス・ロードの速度は同じです。ただし、クラスは共有メモリーにロードされるため、そのクラスの他のユーザーはクラスを再ロードする必要はなく、同じ事前ロード・クラスを使用します。 |
信頼性 | 動的クラス・ロードの利点は、プログラムの更新がサポートされることです。たとえば、サーバー上でクラスを更新すると、プログラムをダウンロードして動的にロードするクライアントでは、次回そのプログラムを使用するときに更新されたことがわかります。サーバー・プログラムでは、信頼性が重視されます。開発者は、各クライアントが特定のプログラム構成を実行していることを認識する必要があります。意図していない一部のクラスがクライアントによって不注意にロードされないようにしてください。 | Oracle Databaseでは、アップロードおよび解決操作が、実行時のクラス・ロード操作と分離されます。開発したJavaコードをサーバーにアップロードするには、loadjava ツールを使用します。CLASSPATH を使用するかわりに、インストール時にリゾルバを指定します。リゾルバはCLASSPATH に類似していますが、クラスが存在するスキーマを指定できます。このように解決操作をクラス・ロードから分離することで、ユーザーがどのプログラムを実行しているかを常に把握できます。
|
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との重要な相違点をいくつか説明します。
標準的なJava環境では、コマンドラインで次のコマンドを発行することで、インタプリタを介してJavaアプリケーションを実行します。このコマンドで、classname
は、JVMで最初に解析するクラスの名称です。
java classname
Oracle JVMを使用する際には、アプリケーションをデータベースにロードし、インタフェースを公開してから、データベース・セッション内でアプリケーションを実行する必要があります。データベース・セッションは、Oracle JVMが実行している環境であり、そのため、標準的なクライアントJVMが実行しているオペレーティング・システム・プロセスと類似しています。
標準的なクライアントベースのJavaアプリケーションでは、トップレベルのメソッド(public static void main(String args[])
)が1つ宣言されます。このメソッドは1回実行され、Java仮想マシンのインスタンス化はそのコールの期間中、続きます。しかし、Oracle Javaアプリケーションは、単一のトップレベルの主なエントリ・ポイントに制限されず、Oracle JVMのインスタンス化の期間は、単一のコールおよびこのエントリ・ポイントからのコールの終了によって決定されません。各クライアントは、セッションを開始し、トップレベルのエントリ・ポイント経由でサーバー側の論理モジュールをコールし、セッションを終了します。同じJVMインスタンスは、セッションの期間全体に設定されたままであるため、静的変数の値などのデータ状態は、トップレベルの複数のエントリ・ポイントへの複数のコールにわたって使用できます。
データベースにロードおよび公開されたクラス定義は、通常、そのデータベース内のすべてのセッションで使用可能です。指定したセッション内のJVMインスタンス、Javaデータ・オブジェクト、そのJVMインスタンス内のグローバル・フィールド値は、セッションに対してプライベートです。このデータは、セッションの期間中存在し、そのセッションの存続期間内の複数のコールによって使用できます。しかし、このデータは他のセッションでは参照できず、データはどの方法でも他のセッションと共有できません。これは、標準的なクライアントJavaアプリケーションの、mainメソッドの離れた起動で同じクラス定義を共有する方法に類似していますが、これらの起動中に作成および使用されるデータは切り離されています。
サーバーではGUIは提供されませんが、GUIを動作させるロジックが提供されます。Oracle JVMでは、Java Abstract Window Toolkit (AWT)のヘッドレス・モードのみがサポートされます。サーバー上でGUIを実体化しようとしないかぎり、すべてのJava AWTクラスをサーバー環境で使用でき、プログラムでJava AWTの機能を利用できます。
表1-1に、Oracle JVMの機能と、その機能が最初にサポートされたバージョンを示します。
表1-1 Oracle JVMの機能リスト
機能 | サポートされた最初のOracle JVMリリース |
---|---|
|
11.1 |
|
11.1 |
|
11.1 |
|
11.1 |
データベース常駐JAR |
11.1 |
ユーザー・クラスロード・クラスのメタデータの共有サポート |
11.1 |
Javaセッションの状態に使用する2層の期間のサポート |
11.1 |
デフォルトのサービス機能 |
11.1 |
Just-In-Time(JIT)コンパイラ |
11.1 |
Internet Protocol Version 6(IPv6)のサポート |
11.2 |
JDK 6のサポート |
12.1 |
JDK 7のサポート |
12.1 |
この項では、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トランスレータの概要について説明します。
JavaクラスをOracle Databaseに格納するには、SQLのCREATE JAVA
文を使用してその作業を実行する、loadjava
コマンドライン・ツールを使用します。CREATE JAVA {SOURCE | CLASS | RESOURCE}
文によってコールされると、ライブラリ・マネージャはJavaのソース、クラスまたはリソース・ファイルをデータベースにロードします。これらのJavaスキーマ・オブジェクトは直接アクセスされることはなく、Oracle JVMのみが使用します。
Oracle JVMには、標準のJavaコンパイラが組み込まれています。CREATE JAVA SOURCE
文が実行されると、Javaコンパイラは、Javaソース・ファイルをバイトコードと呼ばれるアーキテクチャに依存しない1バイトの命令に変換します。各バイトコードは、命令コードとそれに続くオペランドで構成されています。結果として、Javaの標準に完全に準拠したJavaクラス・ファイルが生成され、実行時にインタプリタに送信されます。
Javaプログラムを実行するために、Oracle JVMには標準Java 2のバイトコード・インタプリタが組み込まれています。インタプリタとそれに関連するJavaランタイム・システムによって、標準のJavaクラス・ファイルが実行されます。ランタイム・システムでは、ネイティブ・メソッド、およびホスト環境からのコールとホスト環境へのコールがサポートされます。
注意: パフォーマンスを向上させるためにJavaコードをコンパイルすることもできます。Oracle JVMでは、ネイティブにコンパイルされたコアなJavaクラス・ライブラリ、SQLJトランスレータおよびJDBCドライバが使用されます。 |
ランタイム・システムからの要求に応答して、Javaクラス・ローダーは、データベースに格納されているJavaクラスを検索、ロードおよび初期化します。クラス・ローダーはクラスを読み取り、そのクラスの実行に必要なデータ構造を生成します。不変のデータやメタデータは、初期化が1回の共有メモリーにロードされます。この結果、セッションごとに必要なメモリー量が低下します。クラス・ローダーは、必要に応じて外部参照を解決しようとします。また、ソース・ファイルが使用可能な場合、Javaクラス・ファイルを再コンパイルする必要があるときは、Javaコンパイラを自動的にコールします。
Javaクラス・ファイルは、完全に移植可能で、明確に定義された形式に準拠しています。検証機能は、プログラム・フローを改ざんしたり、アクセス制限に違反する恐れのあるにせのJavaクラス・ファイルが誤って使用されるのを防止します。OracleのセキュリティとJavaのセキュリティが検証機能と連携することによって、ユーザーのアプリケーションとデータが保護されます。
JDBCは標準であり、ベンダーに依存しないリレーショナル・データへのアクセスを提供するJavaクラスのセットを定義します。ODBCおよびX/Open SQL Call Level Interface(CLI)をモデルにしたJDBCクラスは、複数のデータベースへの同時接続、トランザクション管理、単純な問合せ、ストアド・プロシージャのコール、LONG
型の列データへのストリーム形式のアクセスなどの標準的な機能を提供します。
特別にチューニングされたJDBCドライバは、下位レベルのエントリ・ポイントを使用してOracle Database内で直接実行され、Javaストアド・プロシージャからOracleデータへの高速アクセスを提供します。サーバー側JDBC内部ドライバは、標準のJDBC仕様に完全に準拠しています。JDBCドライバは、データベースと緊密に統合されているため、Oracle固有のデータ型、グローバリゼーション・キャラクタ・セットおよびストアド・プロシージャをサポートしています。また、クライアント側とサーバー側のJDBC APIが同じであるため、アプリケーションの分割を容易に行うことができます。
SQLJを使用すると、SQL文をJavaプログラムに埋め込むことができます。これはJDBCよりも簡潔であり、静的な分析と型チェックに対してすぐに応答できるようになります。それ自体がJavaプログラムであるSQLJプリプロセッサは、SQLJ句が埋め込まれているJavaソース・ファイルを入力として取得します。次に、SQLJ句を、指定したSQL文を実装するJavaクラス定義に変換します。Java型システムによって、これらのクラスのオブジェクトは正しい引数でコールされることが保証されます。
高度に最適化されたSQLJトランスレータはデータベース内で直接実行され、サーバー側JDBC内部ドライバを使用して、Oracleデータへのランタイム・アクセスを提供します。SQLJフォームには、問合せ、データ操作言語(DML)文、データ定義言語(DDL)文、トランザクション制御文、およびストアド・プロシージャのコールを組み込むことができます。クライアント側とサーバー側のSQLJ APIが同じであるため、アプリケーションの分割を容易に行うことができます。
Oracle Database環境でJava実装の重要な部分を構成するクラスのセットはシステム・クラスと呼ばれます。これらのクラスは、SYS
スキーマで定義され、すべてのユーザーについてPUBLICシノニムごとにエクスポートされます。いずれかのシステム・クラスと同じ名前を持つクラスは、SYS
スキーマ以外のスキーマで定義できます脚注1。ただし、その代替クラスが、他のシステム・クラスまたはJava仮想マシンの基本的な実装に存在する、そのクラスのセマンティクスの条件に違反して動作することがあるため、これは適切な操作ではありません。オラクル社では、この操作は絶対にお薦めしません。
Oracleは、エンタープライズ・アプリケーションの開発者に、Javaアプリケーションの作成、デプロイおよび管理のためのエンドツーエンドのJavaソリューションを提供します。この総合的なソリューションは、クライアント側とサーバー側のプログラム・インタフェース、Java開発をサポートするツール、Oracle Databaseと統合されたJVMで構成されています。これらの製品はすべて、Java標準と完全に互換性があります。この項の内容は、次のとおりです。
データベース・アプリケーション開発におけるJavaの最も重要な機能は、次のとおりです。
JDBCおよびSQLJレベルの対称型データ・アクセスに対する、Java2 Platform, Standard Edition(J2SE)アプリケーションの柔軟な分割の提供。
SQLとJava2 Platform, Enterprise Edition(J2EE)のブリッジ。次の方法があります。
JSPやサーブレットなどのWebコンポーネントのコール
SQLとWebサービスのブリッジ
Webサービスのコール
ERP統合ハブとしてのOracle JVMの使用
キャッシュの無効化
Javaプログラミング環境には、Oracle JVM以外に次のコンポーネントがあります。
PL/SQLに等価および相当するJavaストアド・プロシージャ。Javaストアド・プロシージャは、PL/SQLと緊密に統合されています。PL/SQLパッケージからJavaストアド・プロシージャをコールでき、Javaストアド・プロシージャからPL/SQLプロシージャをコールできます。
SQLデータにアクセスするためのJDBCおよびSQLJプログラミング・インタフェース。
クラスの開発、ロードおよび管理に役立つツールとスクリプト。
どのような場合にどのJava APIを使用するかを判断するには、次の表を参考にしてください。
必要な機能のタイプ | 使用するJava API |
---|---|
トリガーなどのJavaプロシージャをSQLからコールする場合。 | Javaストアド・プロシージャ |
既知の列名を持つ既知の表にある静的で単純なSQL文を、Javaオブジェクトからコールする場合。 | SQLJ |
動的な複合SQL文をJavaオブジェクトからコールする場合。 | JDBC |
Javaストアド・プロシージャは、PL/SQLストアド・プロシージャと同様に、サーバーで作成およびデプロイされ、サーバーで実行されるJavaプログラムです。Javaストアド・プロシージャを起動するには、SQL*Plusなどの製品から直接起動するか、またはトリガーを使用して間接的に起動します。また、OCIやPRO*などのすべてのOracle Netクライアント、あるいはJDBCまたはSQLJからアクセスできます。
また、Javaを使用して、PL/SQLに依存しない強力なサーバー側プログラムを開発することもできます。Oracle Databaseには、標準Javaプログラミング言語および完全準拠のJVMの完全な実装が用意されています。
既存のPL/SQLプログラムをJavaからコールしたり、JavaプログラムをPL/SQLからコールできます。このソリューションでは、PL/SQLおよびJavaのコードを保護して利用しながら、Javaベースのインターネット・コンピューティングの利点と機会を活用できます。
Oracle Databaseでは、SQLデータにアクセスするためのJava APIが、JDBCとSQLJの2種類提供されています。両方のAPIをクライアントとサーバーで使用できます。このため、コードを変更せずに、クライアントとサーバーにアプリケーションをデプロイできます。
次の各項では、Oracle Databaseで提供されるJava APIおよびJPublisherのツールについて説明します。
JDBCは、ユーザーがデータベースに接続してSQL文を実行し、データベースに問合せできるようにするデータベース・アクセス・プロトコルです。コアなJavaクラス・ライブラリに用意されているJDBC APIは、java.sql
とjavax.sql
です。ただし、JDBCは、ベンダーが特定のデータベースを必要に応じて特化するためのドライバを提供できるように設計されています。Oracleには、次のJDBCドライバが個別に用意されています。
ドライバ | 説明 |
---|---|
JDBC Thinドライバ | JDBC Thinドライバを使用すると、Oracle SQLのデータにアクセスするPure Javaのアプリケーションおよびアプレットを作成できます。JDBC Thinドライバは、他のJavaアプレットと同様にWebページから動的にダウンロードできるため、Webベースのアプリケーションとアプレットに特に適しています。 |
JDBC OCIドライバ | JDBC OCIドライバは、クライアントまたは中間層にあるOracle固有のネイティブ・コード(つまり非Javaコード)およびライブラリにアクセスします。JDBC Thinドライバと比較してパフォーマンスが向上しますが、サイズが極端に大きくなること、およびクライアント側でインストールが必要であるという問題があります。 |
サーバー側JDBC内部ドライバ | Oracle Databaseは、Javaコードがサーバー上で実行される場合に、サーバー側内部ドライバを使用します。これにより、サーバーのOracle JVM内で実行中のJavaアプリケーションは、ローカルに定義されたデータ(つまり、同じシステムの同じプロセスにあるデータ)にJDBCを使用してアクセスできます。また、基礎となるOracle RDBMSライブラリを直接使用できるため、パフォーマンスが向上し、JavaコードとSQLデータの間にネットワーク接続が介入することによるオーバーヘッドは発生しません。Oracle Databaseでは、サーバー上で同じJava-SQLインタフェースがサポートされるため、デプロイ時にコードの再処理を必要としません。 |
オラクル社は、IBM社、Tandem社、Sybase社などの他のベンダーと共同で作業し、SQL文をJavaプログラムに埋め込む、SQLJと呼ばれる標準方式を開発しました。この結果、JDBCより単純で生産性の高いプログラミングAPIに関して、新しい標準ANSI x.3.135.10-1998が作成されました。ユーザーはこの高水準のAPIに対するアプリケーションを作成し、プリプロセッサを使用して、そのプログラムをJDBCコールが含まれる標準のJavaソースに変換します。実行時に、プログラムは、標準のJDBCドライバを使用してマルチベンダーのデータベースと通信できます。
SQLJは、Javaからデータベースにアクセスするクライアント・サイド・アプリケーションと中間層アプリケーションの両方を開発するための、単純ですが強力な方法を提供します。Oracle Database 12c環境内では、ストアド・プロシージャ、トリガーおよびメソッドでSQLJを使用できます。また、SQLJプログラムはJDBCと結合できます。
SQLJトランスレータは、Javaソース・コードの埋込みSQLをJDBCベースのPure Javaコードに変換するJavaプログラムです。Oracle Database 12cでは完全なJava環境が提供されているため、サーバーで実行されるSQLJプログラムをクライアントでコンパイルすることはできません。かわりに、サーバーで直接コンパイルできます。Oracle Databaseはインターネット標準に準拠しているため、必要に応じて開発スタイルを選択できます。
JPublisherは、既存のOracleリレーショナル・データベース表にアクセスするJavaプログラムを作成するための、使いやすい便利なツールを提供します。
関連項目: 『Oracle Database JPublisherユーザーズ・ガイド』 |
JavaをOracle Databaseに導入することによって、複数のJava IDEを使用できるようになります。Oracle Databaseは、Javaの標準と仕様およびオープン・インターネットの標準とプロトコルに完全に準拠しているため、作成したJavaのプログラムは、Oracle Database上にデプロイしたときに正常に動作することが保証されます。Oracleには、Javaで作成されているツールやユーティリティが多数あり、Javaサーバー・アプリケーションの開発およびデプロイメントを容易にします。また、Oracle JDeveloper(Oracleが提供するJava IDE)には、Javaストアド・プロシージャとEJBのデプロイメントを容易にするために特別に設計された機能が多数あります。JDeveloperは、http://www.oracle.com/technetwork/developer-tools/jdev/overview/index.html
からダウンロードできます。
Oracle Database 11gリリース2から、Oracle JVMでは、URLのInternet Protocol Version 6 (IPv6)アドレスと、IPv6アドレスに解決されるデータベース内のJavaコードのマシン名をサポートしています。IPv6は、Internet Engineering Task Force(IETF)で設計された新しいネットワーク層プロトコルで、Internet Protocolの現行バージョンのInternet Protocol Version 4(IPv4)に代わるものです。IPv6の主な利点として、128ビット・アドレスの使用から導出される大容量のアドレス空間があります。また、ルーティング、ネットワークの自動構成、セキュリティ、サービスの質などの分野でIPv4が改良されています。
次のシステム・プロパティを使用すると、IPv6のプリファレンスを構成できます。
java.net.preferIPv4Stack
IPv6がオペレーティング・システムで使用可能な場合、基礎となるネイティブ・ソケットはIPv6ソケットになります。このため、JavaアプリケーションはIPv4とIPv6の両方のホストに接続して、これらのホストからの接続を受け入れることができます。アプリケーションでIPv4ソケットのみを使用するようにプリファレンスが設定されている場合、このプロパティをtrue
に設定できます。プロパティをtrue
に設定すると、アプリケーションはIPv6のホストと通信できなくなります。
java.net.preferIPv6Addresses
IPv6がオペレーティング・システムで使用可能な場合でも、アドレスは下位互換性があるためIPv4にマップされます。たとえば、IPv4サービスへのアクセスのみに依存するアプリケーションでは、このようなマッピングによる利点があります。IPv4アドレス経由でIPv6アドレスを使用するようにプリファレンスを変更する場合は、java.net.preferIPv6Addresses
プロパティをtrue
に設定します。これにより、アプリケーションがIPv6サービスに接続すると予測される環境でアプリケーションのテストとデプロイを行うことができます。
注意: データベースを初期化する際にJavaが有効な場合、IPv6のサポートに必要な新しいシステム・クラスがすべてロードされます。そのため、ソフトウェアのコードに含まれるアドレスがアプリケーションに存在しない場合、IPv6の機能を使用するようにコードを変更する必要はありません。 |
Oracle Database 12cリリース1 (12.1)から、Oracle JVMでは、最新のJDKバージョンを含む複数のJDKバージョンをサポートしています。通常、サポートされるバージョンは、デフォルト・バージョンとその次の上位バージョンです。Oracle Database 12cリリース1 (12.1)ではJDK 6およびJDK 7がサポートされており、JDK 6がデフォルトのJDKバージョンです。したがって、JDKバージョンを明示的に設定しない場合、有効なJDKバージョンはJDK 6となります。
ある時点でデータベースに有効なJDKバージョンは、1つのみです。ニーズに応じて、別のJDKバージョンに切り替えることができます。
注意:
|
JDKバージョンの設定
この項では、次の2つのシナリオにおいてデータベースのJDKバージョンを設定する手順を説明します。
ORACLE_HOME
を使用してシステムにOracle Database 12cリリース1 (12.1)サーバーをインストールしたが、データベースをまだ作成していない場合は、特定のJDKバージョンでデータベースを作成できます。
JDK 6でデータベースを作成する場合は、これがデフォルトのJDKバージョンであるため、通常のデータベース作成手順を実行できます。JDK 7でデータベースを作成する場合は、次の手順を実行します。
次のPerlスクリプトを実行します。
perl $ORACLE_HOME/javavm/install/update_javavm_binaries.pl 7
オプションで、プラットフォームに基づいてOracleを再リンクします。
Windowsプラットフォームの場合、再リンクは必要ありません。Windows以外のプラットフォームの場合、次のコマンドを使用してOracleを再リンクします。
cd $ORACLE_HOME/rdbms/lib make -f ins_rdbms.mk ioracle
ins_rdbms.mk
はMakeファイルの名前であり、ioracle
はターゲットです。
通常のデータベース作成手順を実行します。
注意: 後からこのORACLE_HOME を使用して作成したデータベースのJDKバージョンは、JDK 7に設定されます。このようなデータベースのJDKバージョンを変更するには、「既存のデータベースを使用する」に示されている手順を実行します。 |
ORACLE_HOME
を使用してシステムにOracle Database 12cリリース1 (12.1)サーバーをインストールし、JDKバージョンxでデータベースを作成した場合、次の手順に従ってJDKバージョンをyに変更します。
ORACLE_HOME
を使用して実行されているすべてのデータベースを停止します。
注意: Windowsプラットフォームの場合、特定のORACLE_SID に対応するOracleサービスもすべて停止する必要があります。 |
次のPerlスクリプトを実行します。
perl $ORACLE_HOME/javavm/install/update_javavm_binaries.pl y
オプションで、プラットフォームに基づいてOracleを再リンクします。
Windowsプラットフォームの場合、再リンクは必要ありません。Windows以外のプラットフォームの場合、次のコマンドを使用してOracleを再リンクします。
cd $ORACLE_HOME/rdbms/lib make -f ins_rdbms.mk ioracle
ins_rdbms.mk
はMakeファイルの名前であり、ioracle
はターゲットです。
JDK yで使用するデータベースを起動します。
注意: Windowsプラットフォームの場合、データベースを起動する前に、特定のORACLE_SID に対応するOracleサービスもすべて起動する必要があります。 |
非CDB脚注 2 の場合、これらの各データベース内で、SYS
として次の.sql
スクリプトを実行します。
$ORACLE_HOME/javavm/install/update_javavm_db.sql
注意: Oracle RACの場合、次の手順を実行する必要があります。
|
CDB脚注 3 の場合、次の手順を実行します。
次のコマンドをSYSユーザーとして実行し、すべてのコンテナを開きます。
alter pluggable database all open;
シェルで次のコマンドを使用して、すべてのコンテナで$ORACLE_HOME/javavm/install/update_javavm_db.sql
スクリプトを実行します。
perl -I $ORACLE_HOME/rdbms/admin $ORACLE_HOME/rdbms/admin/catcon.pl -b <some_log_file_name> $ORACLE_HOME/javavm/install/update_javavm_db.sql
注意: 前述のPERLコマンドを実行する前に、PATH 変数に値$ORACLE_HOME/bin が含まれていることを確認します。このようにPATH を設定して、catcon.pl スクリプトを実行したときSQL*Plusが見つかるようにする必要があります。 |
関連項目: CDBおよび非CDBの詳細は、『Oracle Database管理者ガイド』 |
Oracle Database 10g以降のOracle JVMには、専用サーバーを介してデータベースに接続するセッション用に新しいメモリー・モデルが用意されています。Oracleに関連する基本的なメモリー構造を次に示します。
システム・グローバル領域(SGA)
SGAは、SGAコンポーネントと呼ばれる共有メモリー構造のグループで、1つのOracle Databaseインスタンスのデータと制御情報が含まれます。SGAは、すべてのサーバー・プロセスとバックグラウンド・プロセスで共有されます。SGAに格納されるデータには、キャッシュ・データ・ブロックや共有SQL領域などがあります。
プログラム・グローバル領域(PGA)
PGAは、サーバー・プロセスのデータおよび制御情報が含まれるメモリー領域です。これは、サーバー・プロセスの起動時にOracleで作成される非共有メモリーです。PGAへのアクセスは、サーバー・プロセスごとに排他的です。各サーバー・プロセスごとに1つのPGAが存在します。バックグラウンド・プロセスにも独自のPGAが割り当てられます。1つのOracleインスタンスに付随するすべてのバックグラウンド・プロセスおよびサーバー・プロセスに割り当てられるPGAメモリーの合計は、PGA総計と呼ばれます。
メモリーを管理するには、データベースによって自動的に管理およびチューニングする方法が最も簡単です。これを実行するには、ほとんどのプラットフォームの場合、ターゲット・メモリー・サイズ初期化パラメータ(MEMORY_TARGET
)と最大メモリー・サイズ初期化パラメータ(MEMORY_MAX_TARGET
)のみを設定します。データベースでターゲット・メモリー・サイズにチューニングされ、必要に応じてSGAとPGA総計との間でメモリーが再分配されます。ターゲット・メモリー初期化パラメータは動的であるため、データベースを再起動せずにいつでもターゲット・メモリー・サイズを変更できます。ユーザーがターゲット・メモリー・サイズの設定を誤って高くしすぎないように、最大メモリー・サイズが上限として機能します。また、一部のSGAコンポーネントは簡単に縮小できないか、または最小サイズに抑える必要があるため、データベースではユーザーがターゲット・メモリー・サイズの設定を低くしすぎないようにします。
関連項目: 『Oracle Database管理者ガイド』 |
脚注の凡例
脚注1: いずれかのシステム・クラスと同じ名前を持つクラスを常に定義できるわけではありません。java.lang
などのクラスが一部のパッケージに存在する場合、このような定義はコードによって明示的に妨げられます。