1.6 Oracle DatabaseにおけるJavaプログラミング

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

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

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

  • Java SE APIとJDBCを使用した、データ・バインドされたプロシージャおよびファンクションの設計。

  • 標準およびサード・パーティのJavaライブラリを使用したデータベースの範囲と機能の拡張。データベースでドライバを使用したサード・パーティ・データベースへのアクセスやHadoop/HDFSへのアクセスなど。

  • JDBCレベルの対称型データ・アクセスに対する、Java2 Platform, Standard Edition (J2SE)アプリケーションの柔軟なパーティション化の実現。

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

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

    • Webサービス・コールアウトを使用したSQLとWebサービスのブリッジ

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

  • キャッシュの無効化。

1.6.2 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

1.6.3 Javaストアド・プロシージャ

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

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

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

既存のPL/SQLプログラムをJavaから呼び出したり、JavaプログラムをPL/SQLから起動できます。このソリューションでは、PL/SQLおよびJavaのコードを保護して利用しながら、Javaベースのインターネット・コンピューティングの利点と機会を活用できます。

Oracle Databaseでは、SQLデータにアクセスするためのJava APIが、JDBCとSQLJの2種類提供されています。これらのAPIはいずれもクライアントで使用でき、JDBC APIはサーバーでも使用できます。このため、クライアントとサーバーにアプリケーションをデプロイできます。

次の各項では、Oracle Databaseで提供されるJava APIについて説明します。

1.6.4.1 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インタフェースがサポートされるため、デプロイ時にコードの再処理を必要としません。

1.6.4.2 SQLJ

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

SQLJは、Javaからデータベースにアクセスするクライアント側アプリケーションを開発するための、単純ですが強力な方法です。SQLJは、ストアド・プロシージャおよびトリガーで使用できます。また、SQLJプログラムをJDBCと組み合せることもできます。

SQLJトランスレータは、Javaソース・コードの埋込みSQLをJDBCベースのPure Javaコードに変換するJavaプログラムです。

1.6.5 開発ツール

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

1.6.6 Internet Protocol Version 6のサポート

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の機能を使用するようにコードを変更する必要はありません。