ヘッダーをスキップ
Oracle® Database Java開発者ガイド
11gリリース2 (11.2)
B56280-05
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

1 Oracle DatabaseにおけるJavaの概要

Oracle Databaseでは、Javaアプリケーションの開発、格納およびデプロイがサポートされています。この章では、SQLデータと統合されたサーバー側アプリケーションの開発に習熟しているOracle PL/SQLの開発者を対象として、Java言語について説明します。これらの開発者は、Oracle Databaseのスケーラビリティおよびパフォーマンスを利用したJavaのサーバー側アプリケーションを開発できます。

この章の内容は、次のとおりです。

Javaの概要

Javaは、優れたオブジェクト指向プログラミング言語として登場しました。Javaの重要な概念は次のとおりです。

  • Java仮想マシン(JVM)。プラットフォームの独立性を確保するための基礎を提供します。

  • 自動記憶域管理機能。例: ガベージ・コレクション。

  • C言語の構文に類似した言語構文。

このような概念から、オブジェクト指向で、アプリケーション・プログラムを効率的に作成できる言語であるJavaが開発されました。

この項の内容は、次のとおりです。

Javaおよびオブジェクト指向プログラミングの用語

次の用語は、Oracle Database環境におけるJavaアプリケーション開発でよく使用される用語です。

クラス

クラスの概念は、どのオブジェクト指向プログラミング言語でもサポートされています。表定義のように、クラスでは、共通の特性を持つオブジェクトのテンプレートが提供されます。各クラスで、次の項目を定義できます。

  • フィールド

    フィールドは、特定クラスの各オブジェクト(インスタンス)に存在する変数、または、グローバルですべてのインスタンスに共通な変数です。インスタンスのフィールドは、リレーショナル表の行の列に類似しています。クラスによって、フィールドと各フィールドの型が定義されます。

    Javaでは、フィールドをstaticとして宣言できます。staticとして宣言されたクラスのフィールドはグローバルであり、そのクラスのすべてのインスタンスに共通です。Javaランタイムの特定のインスタンス内の静的フィールドに対して、特定の時点の値は1つのみです。staticとして宣言されないフィールドは、そのクラスの各インスタンス内で個別の値として作成されます。

    publicprivateprotectedおよびデフォルト・アクセス修飾子では、アプリケーションのフィールドの範囲が定義されます。Java言語仕様(JLS)では、すべてのフィールドに対するデータの可視性規則が定義されます。可視性規則では、これらのフィールド内のデータにどのような場合にアクセスできるかが定義されます。

    図1-1の例では、従業員識別子がprivateとして定義されており、これは、他のオブジェクトがこのフィールドに直接アクセスできないことを示しています。この例で、オブジェクトがidフィールドにアクセスするには、getId()メソッドをコールします。

  • メソッド

    メソッドは、クラスに関連付けられたプロシージャです。フィールドと同様に、メソッドをstaticとして宣言でき、この場合、グローバルにコールできます。メソッドをstaticとして宣言しない場合、そのメソッドはインスタンス・メソッドで、オブジェクトがクラスのインスタンスである場合のオブジェクト上の操作としてのみコールできることを示しています。

    フィールドと同様に、メソッドは、publicprivateprotectedまたはデフォルト・アクセスとして宣言できます。この宣言では、メソッドをコールできる範囲が定義されます。

オブジェクト

Javaオブジェクトはクラスのインスタンスであり、リレーショナル表の行に類似しています。オブジェクトはデータ値の集まりで、クラスの非静的フィールド定義によって記述される個々の要素です。

図1-1に、2つのフィールドid(従業員識別子)とlastName(従業員の姓)、およびgetId()メソッドとsetId(String anId)メソッドで定義されているEmployeeクラスの例を示します。idフィールドとgetId()メソッドはprivateであり、lastNameフィールドとsetId(String anId)メソッドはpublicです。

図1-1 クラスとインスタンス

図1-1の説明が続きます
「図1-1 クラスとインスタンス」の説明

インスタンスを作成すると、フィールドには、ある従業員にのみ関係する個人のプライベートな情報が格納されます。つまり、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()メソッドを次のように実装します。

private float compensationToDate()
{
  return (super.compensationToDate() + this.overtimeToDate()); 
}

フルタイム従業員の場合は、compensationToDate()メソッドを次のように実装できます。

private float compensationToDate()
{
  return (super.compensationToDate() + this.bonusToDate());
}

メソッド名を共通して使用することで、従業員の種類を指定しなくても、異なるクラスのメソッドをコールして、結果を取得できます。フルタイム従業員とパートタイム従業員を処理するために特別なメソッドを記述する必要はありません。

また、Employeeからプロパティを継承しないContractorクラスを作成し、このクラスにcompensationToDate()メソッドを実装することもできます。給与累計の合計を計算するプログラムは、フルタイム、パートタイム、契約社員のいずれであるかに関係なく給与計算時に全従業員に対して反復処理し、従業員ごとにcompensationToDate()メソッドをコールして戻された値を合算します。メソッドのコール元が正常に動作することを認識した上で、個々のcompensationToDate()メソッドまたはクラスを安全に変更できます。

Java言語の主な機能

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仮想マシン

Javaソースは、他の高水準のコンピュータ言語と同様に、低水準のコンピュータの命令にコンパイルされます。各命令サイズが一律に1バイトであるため、Javaでは、これらの命令はバイトコードと呼ばれています。Cなど他のほとんどの言語は、IntelまたはHPプロセッサに固有の命令など、コンピュータ固有の命令にコンパイルされます。

コンパイル時に、Javaコードは、Java仮想マシン(JVM)によって実行される、プラットフォームに依存しない標準のバイトコード・セットに変換されます。JVMは、Javaコードを実行する特定のプラットフォーム用に最適化された個別のプログラムです。

図1-2に、プラットフォームの独立性が、Javaによってどのように保持されるかを示します。各プラットフォームには、オペレーティング・システムに固有のJVMがインストールされています。Javaバイトコードは、JVMを介して、プラットフォームに依存する適切な処理へと解析されます。

図1-2 Javaコンポーネント構造

図1-2の説明が続きます
「図1-2 Javaコンポーネント構造」の説明

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ライブラリと対話します。

図1-3 Oracle DatabaseのJavaコンポーネント構造

図1-3の説明は図の下のリンクをクリックしてください。
「図1-3 Oracle DatabaseのJavaコンポーネント構造」の説明

Sun社によって、Java言語およびJVMの仕様が公開されています。JLSで構文やセマンティクスなどが定義され、JVM仕様では、アプリケーションを実行するシステムに必要な下位レベルのアクションが定義されます。さらに、Sun社からは、JVMの実装者が仕様に従ってコンパイルしたかどうかを判断するための互換性テスト一式が提供されています。このテスト一式は、Java Compatibility Kit(JCK)と呼ばれます。Oracle JVM実装は、JCKに完全に準拠しています。総合的なJava方針の一環として、公に規定された標準と、その標準への準拠を検証する簡単な方法によって、ベンダーはすべてのプラットフォームで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クラスで定義されたメソッドです。

図1-4 クラス階層

図1-4の説明が続きます。
「図1-4 クラス階層」の説明

クラスBのインスタンスは、クラスAのインスタンスのかわりに使用でき、継承は、コードの再利用性を改善するための、オブジェクト指向言語の別の強力な構成となります。動作と状態を定義するクラスを、階層内の適切な場所、しかもクラス・ライブラリの既存の機能を利用できる場所に作成できます。

Oracle DatabaseにおけるJavaの使用

Javaは豊富なセキュリティ機能を備えた安全な言語であるため、データベースでJavaアプリケーションを作成およびロードできます。Javaは、Javaコードが格納されているオペレーティング・システムの改ざんを防止するように開発されています。Cなど、一部の言語では、データベースにセキュリティ上の問題が発生する可能性があります。これに対してJavaは、その設計により、データベース内の使用にも堅牢な言語です。

Java言語は開発者にとって多数の利点がありますが、Javaサーバー・アプリケーションをサポートするJVMをスケーラブルな方法で実装するのは容易ではありません。この項では、次の問題について説明します。

JavaとRDBMS: 堅牢な組合せ

Oracle Databaseでは、Javaアプリケーションに対して、複合問合せの実行や同一データの異なるビューでの表示をサポートする動的なデータ処理エンジンが提供されます。クライアントからの要求はすべてデータ問合せとして構成されて即時処理され、問合せ結果がすぐに生成されます。

JavaとOracle Databaseを組み合せることによって、ビジネス・ニーズの変化に応じて簡単に更新できるコンポーネントベースでネットワーク中心のアプリケーションを作成できます。また、アプリケーションおよびデータ・ストアを、デスクトップからインテリジェント・ネットワークやネットワーク型のサーバーに移動できます。さらに重要なのは、これらのアプリケーションおよびデータ・ストアに任意のクライアント・デバイスからアクセスできることです。

図1-5に、従来の2層クライアント/サーバー構成を示します。この構成では、クライアントは、PL/SQLストアド・プロシージャのコールと同様の方法でJavaストアド・プロシージャをコールします。また、この図では、Oracle Net Services Connection Managerが、多数のネットワーク接続を単一のデータベース接続に結合する方法も示されています。このようにして、Oracle Databaseでは多数の同時ユーザーがサポートされます。

図1-5 2層クライアント/サーバー構成

図1-5の説明が続きます
「図1-5 2層クライアント/サーバー構成」の説明

マルチスレッド

マルチスレッドは、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は、ガベージ・コレクタによって実行される様々なアクションを示しています。

図1-6 ガベージ・コレクション

図1-6の説明が続きます
「図1-6 ガベージ・コレクション」の説明

Oracle JVM内のガベージ・コレクション・アルゴリズムは、次のルールを遵守します。

  1. 新規オブジェクトは新規コール領域内に作成されます。

  2. スキャベンジは既定の間隔で行われます。プログラマによっては、オブジェクトを短期間のみ頻繁に作成する場合があります。このようなタイプのオブジェクトは、新規コール領域内に作成され、すぐにガベージ・コレクションされます。これはスキャベンジと呼ばれます。

  3. スキャベンジを数回繰り返した後も存在し続けているオブジェクトは、しばらくの間存在する可能性のあるオブジェクトとみなされます。これらのオブジェクトは、新規コール領域から旧コール領域に移動されます。移動中にも圧縮が行われます。旧コール領域はスキャベンジ(ガベージ・コレクション)される回数が少ないため、パフォーマンスが向上します。

  4. コール終了時に、コール後も存在するオブジェクトはセッション領域に移動されます。

図1-6は、前述の説明の手順を示しています。このアプローチでは、オブジェクトの種類や存続期間にあわせて、効率的な割当と回収の仕組みが適用されます。たとえば、新規オブジェクトは、迅速な割当とアクセスを目的として設計された、高速でコストの低いコール・メモリーに割り当てられます。Java staticフィールドで保持されるオブジェクトは、より貴重でコストの高いセッション領域に移行されます。

フットプリント

Javaプログラムの実行によるフットプリントは、次の様々な要因の影響を受けます。

  • プログラムのサイズ

    プログラムのサイズは、クラス数、メソッド数およびそれらのコードの量によって決まります。

  • プログラムの複雑さ

    プログラムの複雑さは、プログラム自体ではなく、プログラムの実行時にOracle JVMで使用されるコア・クラス・ライブラリの数によって決まります。

  • JVMが使用する領域の量

    JVMが使用する領域の量は、JVMが割り当てるオブジェクトの数とサイズ、および複数コール間で保持する必要のあるオブジェクトの数によって決まります。

  • ガベージ・コレクタとメモリー・マネージャが、プログラムの実行の要求を処理する能力

    ほとんどの場合、この能力は決定要因ではありません。オブジェクトの割当て速度および他のオブジェクトによって保持される方法が、この要因の重要度に影響を与えます。

スケーラビリティの観点から、複数のクライアントを同時にサポートするには、ユーザー当たりのセッション・フットプリントを最小限に抑えることが重要です。Oracle JVMでは、Javaバイトコードなど、ユーザー用のすべての読取り専用データを共有メモリーに格納することで、ユーザー当たりのセッション・フットプリントを最小限に抑えます。ユーザー・セッションのフットプリントが大きくならないように、コールとセッションのメモリーに対して、適切なガベージ・コレクション・アルゴリズムが適用されます。Oracle JVMでは、ユーザーのセッション・メモリーのメンテナンスに、次の種類のガベージ・コレクション・アルゴリズムが使用されます。

  • ジェネレーション・スキャベンジ: 存続期間の短いオブジェクトの場合

  • マーク/レイジー・スイープ・コレクション: 単一コールの間に存在するオブジェクトの場合

  • コレクタのコピー: 存続期間の長いオブジェクト、つまり、セッション内の複数コールにわたって存在するオブジェクトの場合

Oracle JVMのパフォーマンス

Oracle JVMのパフォーマンスは、SunのJVMのHotSpotと同様に革新的なJust-In-Timeコンパイラを組み込むことによって向上します。プラットフォームに依存しないJavaバイトコードはJVMの上部で実行され、そのJVMは特定のハードウェア・プラットフォームと対話します。ソフトウェア内でレベルを追加すると、パフォーマンスが低下します。Javaでは、バイトコードを解析するために仲介部分を通過する必要があるため、Javaアプリケーションには、C言語のようなプラットフォームに依存する言語を使用して開発されたアプリケーションと比較して、ある程度の非効率性が伴います。この問題に対処するために、複数のJVMサプライヤがネイティブ・コンパイラを作成しています。ネイティブ・コンパイラによって、Javaバイトコードはプラットフォームに依存するネイティブ・コードに変換され、その結果、インタプリタのステップが不要になり、パフォーマンスが向上します。

次の表に、ネイティブ・コンパイルの2つの方法を示します。

コンパイラ 説明
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倍速く実行されます。この結果、プログラムで使用するネイティブ・コードが多いほど、実行速度が速くなります。

図1-7 インタプリタとAccelerator

図1-7の説明が続きます
「図1-7 インタプリタとAccelerator」の説明

動的クラス・ロード

Javaのもう1つの強力な機能は、動的クラス・ロードです。クラス・ローダーは、クラスをディスクからロードし、解析に必要なJVM固有のメモリー構造に格納します。また、クラスをCLASSPATH内で検索し、プログラムの実行中に使用される場合にのみロードします。この方法はアプレットに適していますが、サーバー環境では次の問題があります。

問題 説明 解決策
予測可能性 クラス・ロード操作は、プログラムの初回実行時に重大なペナルティを伴います。単純なプログラムの場合でも、Oracle JVMによって、そのニーズをサポートするための多数のコア・クラスがロードされる可能性があります。ロードされるクラスの数は、プログラマが簡単に予測または判断することはできません。 Oracle JVMは、他のJVMと同様に、クラスを動的にロードします。1回のクラス・ロードの速度は同じです。ただし、クラスは共有メモリーにロードされるため、そのクラスの他のユーザーはクラスを再ロードする必要はなく、同じ事前ロード・クラスを使用します。
信頼性 動的クラス・ロードの利点は、プログラムの更新がサポートされることです。たとえば、サーバー上でクラスを更新すると、プログラムをダウンロードして動的にロードするクライアントでは、次回そのプログラムを使用するときに更新されたことがわかります。サーバー・プログラムでは、信頼性が重視されます。開発者は、各クライアントが特定のプログラム構成を実行していることを認識する必要があります。意図していない一部のクラスがクライアントによって不注意にロードされないようにしてください。 Oracle Databaseでは、アップロードおよび解決操作が、実行時のクラス・ロード操作と分離されます。開発したJavaコードをサーバーにアップロードするには、loadjavaツールを使用します。CLASSPATHを使用するかわりに、インストール時にリゾルバを指定します。リゾルバはCLASSPATHに類似していますが、クラスが存在するスキーマを指定できます。このように解決操作をクラス・ロードから分離することで、ユーザーがどのプログラムを実行しているかを常に把握できます。

関連項目: 第11章「スキーマ・オブジェクトおよびOracle JVMユーティリティ」


Oracle JVMの概要

Oracle JVMは、Pure Javaアプリケーションを実行する標準的なJava互換環境です。Sun社が規定する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アプリケーションのロード、公開および実行の詳細は、第2章「Oracle DatabaseでのJavaアプリケーション」を参照してください。

Javaセッションの初期化、期間およびエントリ・ポイント

標準的なクライアントベースのJavaアプリケーションでは、トップレベルのメソッド(public static void main(String args[]))が1つ宣言されます。このメソッドは1回実行され、Java仮想マシンのインスタンス化はそのコールの期間中、続きます。しかし、Oracle Javaアプリケーションは、単一のトップレベルの主なエントリ・ポイントに制限されず、Oracle JVMのインスタンス化の期間は、単一のコールおよびこのエントリ・ポイントからのコールの終了によって決定されません。各クライアントは、セッションを開始し、トップレベルのエントリ・ポイント経由でサーバー側の論理モジュールをコールし、セッションを終了します。同じJVMインスタンスは、セッションの期間全体に設定されたままであるため、静的変数の値などのデータ状態は、トップレベルの複数のエントリ・ポイントへの複数のコールにわたって使用できます。

データベースにロードおよび公開されたクラス定義は、通常、そのデータベース内のすべてのセッションで使用可能です。指定したセッション内のJVMインスタンス、Javaデータ・オブジェクト、そのJVMインスタンス内のグローバル・フィールド値は、セッションに対してプライベートです。このデータは、セッションの期間中存在し、そのセッションの存続期間内の複数のコールによって使用できます。しかし、このデータは他のセッションでは参照できず、データはどの方法でも他のセッションと共有できません。これは、標準的なクライアントJavaアプリケーションの、mainメソッドの離れた起動で同じクラス定義を共有する方法に類似していますが、これらの起動中に作成および使用されるデータは切り離されています。

GUI

サーバーではGUIは提供されませんが、GUIを動作させるロジックが提供されます。Oracle JVMでは、Java Abstract Window Toolkit (AWT)のヘッドレス・モードのみがサポートされます。サーバー上でGUIを実体化しようとしないかぎり、すべてのJava AWTクラスをサーバー環境で使用でき、プログラムでJava AWTの機能を利用できます。

IDE

Oracle JVMは、Javaアプリケーションの開発ではなく、デプロイメント指向です。アプリケーションの作成とテストは、Oracle JDeveloperなどの任意の統合開発環境(IDE)で行い、その後、クライアントによるアクセスおよび実行用にデータベース内にデプロイできます。


関連項目:

「開発ツール」

Javaのバイナリ互換性によって、任意のIDEで作成したJavaクラス・ファイルをサーバーにアップロードできます。Javaソース・ファイルをデータベースに移動する必要はありません。かわりに、強力なクライアント側のIDEを使用して、サーバー上にデプロイしたJavaアプリケーションをメンテナンスできます。

このリリースの新機能

この項では、Oracle Database 11gリリース2 (11.2)のOracle JVMに関する新機能について説明します。

Internet Protocol Version 6のサポート

このリリースの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 JVMの機能リスト

表1-1に、Oracle JVMの機能と、その機能が最初にサポートされたバージョンを示します。

表1-1 Oracle JVMの機能リスト

機能 サポートされた最初のOracle JVMリリース

JDK 6のサポート

11.2.0.4

loadjavaのURLサポート

11.1

dropjavaを使用したリストベースの操作のサポート

11.1

ojvmtcツール

11.1

Runjavaコマンドライン・インタフェース(JDKに類似のインタフェース)

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


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

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

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

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ドライバと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には標準Java2のバイトコード・インタプリタが組み込まれています。インタプリタとそれに関連するJavaランタイム・システムによって、標準のJavaクラス・ファイルが実行されます。ランタイム・システムでは、ネイティブ・メソッド、およびホスト環境からのコールとホスト環境へのコールがサポートされます。


注意:

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

クラス・ローダー

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

検証機能

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

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

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

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

サーバー側SQLJトランスレータ

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アプリケーション方針

Oracleは、エンタープライズ・アプリケーションの開発者に、Javaアプリケーションの作成、デプロイおよび管理のためのエンドツーエンドのJavaソリューションを提供します。この総合的なソリューションは、クライアント側とサーバー側のプログラム・インタフェース、Java開発をサポートするツール、Oracle Databaseと統合されたJVMで構成されています。これらの製品はすべて、Java標準と完全に互換性があります。この項の内容は、次のとおりです。

データベース・アプリケーション開発におけるJava

データベース・アプリケーション開発におけるJavaの最も重要な機能は、次のとおりです。

  • JDBCおよびSQLJレベルの対称型データ・アクセスに対する、Java2 Platform, Standard Edition(J2SE)アプリケーションの柔軟な分割の提供。

  • SQLとJava2 Platform, Enterprise Edition(J2EE)のブリッジ。次の方法があります。

    • JSPやサーブレットなどのWebコンポーネントのコール

    • SQLとWebサービスのブリッジ

      • Webサービスのコール

    • ERP統合ハブとしてのOracle JVMの使用

    • キャッシュの無効化

Javaプログラミング環境

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ストアド・プロシージャ

Javaストアド・プロシージャは、PL/SQLストアド・プロシージャと同様に、サーバーで作成およびデプロイされ、サーバーで実行されるJavaプログラムです。Javaストアド・プロシージャを起動するには、SQL*Plusなどの製品から直接起動するか、またはトリガーを使用して間接的に起動します。また、OCIやPRO*などのすべてのOracle Netクライアント、あるいはJDBCまたはSQLJからアクセスできます。

また、Javaを使用して、PL/SQLに依存しない強力なサーバー側プログラムを開発することもできます。Oracle Databaseには、標準Javaプログラミング言語および完全準拠のJVMの完全な実装が用意されています。

PL/SQLの統合とOracle RDBMSの機能

既存の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ドライバ

JDBCは、ユーザーがデータベースに接続してSQL文を実行し、データベースに問合せできるようにするデータベース・アクセス・プロトコルです。コアなJavaクラス・ライブラリに用意されているJDBC APIは、java.sqljavax.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インタフェースがサポートされるため、デプロイ時にコードの再処理を必要としません。


関連項目:


SQLJ

オラクル社は、IBM社、Tandem社、Sybase社およびSun社などの他のベンダーと共同で作業し、SQL文をJavaプログラムに埋め込む、SQLJと呼ばれる標準方式を開発しました。この結果、JDBCより単純で生産性の高いプログラミングAPIに関して、新しい標準ANSI x.3.135.10-1998が作成されました。ユーザーはこの高水準のAPIに対するアプリケーションを作成し、プリプロセッサを使用して、そのプログラムをJDBCコールが含まれる標準のJavaソースに変換します。実行時に、プログラムは、標準のJDBCドライバを使用してマルチベンダーのデータベースと通信できます。

SQLJは、Javaからデータベースにアクセスするクライアント・サイド・アプリケーションと中間層アプリケーションの両方を開発するための、単純ですが強力な方法を提供します。SQLJは、Oracle Database 11g環境内のストアド・プロシージャ、トリガーおよびメソッドで使用できます。また、SQLJプログラムはJDBCと結合できます。

SQLJトランスレータは、Javaソース・コードの埋込みSQLをJDBCベースのPure Javaコードに変換するJavaプログラムです。Oracle Database 11gでは完全なJava環境が提供されているため、サーバーで実行されるSQLJプログラムをクライアントでコンパイルすることはできません。かわりに、サーバーで直接コンパイルできます。Oracle Databaseはインターネット標準に準拠しているため、必要に応じて開発スタイルを選択できます。


関連項目:


JPublisher

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/technology/software/products/jdev/index.htmlからダウンロードできます。

専用モード・セッションのメモリー・モデル

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などのクラスが一部のパッケージに存在する場合、このような定義はコードによって明示的に妨げられます。