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

前
 
次
 

5 JDBC Thin固有の機能

この章では、Java Database Connectivity(JDBC)Thinクライアントの概要、およびJDBC Thinドライバのみでサポートされている機能について説明します。Oracle JDBCアプレットを使用する上での基本情報も提供します。この章の内容は次のとおりです。

JDBC Thinクライアントの概要

JDBC Thinクライアントは、pure JavaのType IVドライバです。このドライバは軽量で、インストールも簡単です。このドライバは、JDBC Oracle Call Interface(OCI)ドライバのパフォーマンスに匹敵する高いパフォーマンスを提供します。JDBC Thinドライバは、すべてJavaで記述されており、プラットフォームに依存しません。また、クライアント側に追加のOracleソフトウェアは必要ありません。

JDBC Thinドライバは、Oracle DatabaseからデータにアクセスするためにOracleによって開発されたプロトコル、TTCを使用しているサーバーと通信します。アプリケーション・サーバーとアプレットに対して使用できます。このドライバは、Javaソケットの上にOracle NetとTTCを実装するTCP/IPの実装を提供することにより、データベースへの直接接続を可能とします。このプロトコルはどちらも、対応するサーバー上のプロトコルの軽量版実装です。Oracle NetプロトコルはTCP/IP経由でのみ実行されます。

JDBC Thinドライバは、クライアント側とサーバー側の両方で使用できます。クライアント側では、ドライバは、クライアント上または3層構成の中間層で実行されているJavaアプリケーションやJavaアプレットで使用できます。サーバー側では、このドライバが、リモートのOracle Databaseインスタンスまたは同じデータベースの別のセッションへのアクセスに使用されます。

サポートする追加機能

JDBC Thinドライバは、標準JDBC機能のすべてをサポートします。JDBC Thinドライバは、次の追加機能に対するサポートも提供しています。

アプレットのサポート

このJDBC Thinドライバは、アプレットに対するサポートを提供する唯一のOracle JDBCドライバです。このドライバは、ブラウザで実行するJavaアプレットとともにダウンロードできます。


注意:

JDBC Thinドライバをアプレットと併用する場合は、クライアント側で使用するブラウザがJavaソケットをサポートしている必要があります。

HTTPプロトコルはステートレスで、通常はネットワークを介した通信に使用されます。ただし、JDBC Thinドライバはステートレスではありません。したがって、アプレットおよびJDBC Thinドライバをダウンロードする最初のHTTP要求はステートレスになります。JDBC Thinドライバがデータベース接続を確立すると、ブラウザとデータベース間の通信はステートフルになり、2層構成となります。

ネイティブXAのデフォルトでのサポート

JDBC Thinドライバには、JDBC OCIドライバと同様にネイティブXAに対するサポートが用意されています。ただし、JDBC ThinドライバはデフォルトでネイティブXAをサポートします。この点は、ネイティブXAのサポートをデフォルトでは使用できないJDBC OCIドライバと異なります。

アプレット内のJDBC

アプレットには、Oracle JDBC Thinドライバのみを使用できます。この項では、アプレットをデータベースに接続するために必要な操作について説明します。これには、Webサーバーとは別のホストで動作しているデータベースに接続する場合に、Oracle DatabaseのConnection Manager機能または署名付きアプレットを使用する方法が含まれます。また、ファイアウォールを通過してアプレットをデータベースに接続する方法についても説明します。最後に、アプレットをパッケージ化およびデプロイする方法について説明します。

内容は次のとおりです。

アプレットを介したデータベースへの接続

JDBCドライバを使用したアプレットの最も一般的な作業は、データベースへの接続と問合せです。アプレットのセキュリティ上の制限のため、特定の処理を実行せずにアプレットがオープンできるのは、ダウンロード元のホストへのTCP/IPソケットのみです。この場合のホストは、Webサーバーが実行されているホストを意味します。つまり、特定の処理を行わない場合、アプレットが接続できるのは、Webサーバーと同じホスト上で動作するデータベースのみです。

データベースとWebサーバーが同じホストで動作している場合は、問題はなく処理は必要ありません。アプリケーションから接続する場合と同様に、データベースに接続できます。

アプリケーションから接続する場合と同様に、接続情報をドライバに指定する方法は2つあります。host:port:sidの形式またはTNSキーワード値構文の形式で指定できます。

たとえば、接続するデータベースがポート1521、ホストprodHost、SID(System Identifier)ORCLで、ユーザー名をscott、パスワードをtigerとして接続する場合は、次のいずれかの接続文字列を使用します。

  • host:port:sid構文を使用する場合は、次のようになります。

    String connString="jdbc:oracle:thin:@prodHost:1521:ORCL";
    
    OracleDataSource ods = new OracleDataSource();
    ods.setURL(connString);
    ods.setUser("scott");
    ods.setPassword("tiger");
    Connection conn = ods.getConnection();
    
  • TNSキーワード値構文を使用する場合は、次のようになります。

    String connString = "jdbc:oracle:thin:@(description=(address_list=(address=(protocol=tcp)
    (port=1521)(host=prodHost)))(connect_data=(INSTANCE_NAME=ORCL)))";
    OracleDataSource ods = new OracleDataSource();
    
    ods.setURL(connString);
    ods.setUser("scott");
    ods.setPassword("tiger");
    Connection conn = ods.getConnection();
    

TNSキーワード値ペアを使用してJDBC Thinドライバに接続情報を指定する場合は、プロトコルをTCPとして宣言する必要があります。

ただし、Webサーバーとデータベース・サーバーは、いずれも多くのリソースを必要とします。両方のサーバーが同じコンピュータ上で実行されることはほとんどありません。通常、アプレットはWebサーバーが実行されているホストとは別のホスト上のデータベースに接続します。別のコンピュータで実行中のデータベースにアプレットで接続するには、次の方法があります。

  • ホスト・コンピュータ上でOracle Connection Managerを使用します。アプレットをConnection Managerに接続し、Connection Managerから別のコンピュータ上のデータベースに接続します。

  • 署名付きアプレットを使用すると、他のコンピュータへのソケット接続権限を要求できます。

アプレットで、Oracle DatabaseのAdvanced Securityオプションのデータ暗号化および整合性チェックサム機能も利用できます。

Webサーバーとは異なるホスト上のデータベースへの接続

Webサーバーが動作しているホスト以外のホスト上のデータベースに接続する場合は、アプレットのセキュリティの制限に対処する必要があります。次の方法で対処できます。

Oracle Connection Managerの使用

Oracle Connection Managerは、Oracle Netパケットを受信して別のサーバーに再転送できる軽量でスケーラブルなプログラムです。Oracle Netを実行するクライアントからは、Connection Managerはまるでデータベース・サーバーのように見えます。JDBC Thinドライバを使用するアプレットは、Webサーバー・ホスト上で実行中のConnection Managerに接続し、Connection Managerを使用して、Oracle Netパケットを異なるホスト上で動作するOracleサーバーにリダイレクトできます。

図5-1は、アプレット、Oracle Connection Managerおよびデータベースの関係を示しています。

図5-1 アプレット、Connection Managerおよびデータベースの関係

アプレット、Connection Managerおよびデータベースの関係
「図5-1 アプレット、Connection Managerおよびデータベースの関係」の説明

Oracle Connection Managerを使用するには、次のような2つの手順を実行する必要があります。

  • Connection Managerのインストールおよび実行。

  • Connection Managerをターゲットにした接続文字列の記述。

Oracle Connection Managerのインストールおよび実行

Oracle配布メディアに格納されているConnection ManagerをWebサーバー・ホストにインストールする必要があります。

Webサーバー・ホストでは、ORACLE_HOME/NET8/ADMINディレクトリにCMAN.ORAファイルを作成します。CMAN.ORAファイル内には、ファイアウォールおよび接続プーリングのサポートなどのオプションも宣言できます。

次に、非常に単純なCMAN.ORAファイルの例を示します。web-server-hostを使用するWebサーバー・ホストの名前に置き換えてください。ファイルの4行目は、Connection Managerがポート1610をリスニングしていることを示しています。これと同じポート番号をJDBCの接続文字列に使用する必要があります。

cman = (ADDRESS_LIST = 
       (ADDRESS = (PROTOCOL=TCP) 
       (HOST=web-server-host)
       (PORT=1610)))

cman_profile = (parameter_list = 
       (MAXIMUM_RELAYS=512) 
       (LOG_LEVEL=1) 
   (TRACING=YES) 
       (RELAY_STATISTICS=YES) 
       (SHOW_TNS_INFO=YES) 
       (USE_ASYNC_CALL=YES) 
       (AUTHENTICATION_LEVEL=0)
       )

ファイルの作成後、オペレーティング・システムのプロンプトで次のコマンドを使用してConnection Managerを起動します。

cmctl start

アプレットを使用するには、この時点でアプレット用の接続文字列を記述する必要があります。

Connection ManagerをターゲットにしたURLの記述

ここでは、アプレットがConnection Managerに接続し、Connection Managerがデータベースに接続するようにURLを記述する方法について説明します。URLには、Connection Managerが実行されているWebサーバー・ホストのプロトコル、ポートおよびホスト名を示したアドレス・リストの後に、データベースが実行されているホストのプロトコル、ポートおよびホスト名を指定します。

次の例では、図5-1で示した構成について説明します。Connection Managerを実行しているWebサーバーは、ホストwebHostにあり、ポート1610をリスニングしています。接続対象のデータベースは、ポート1521をリスニングし、SIDがORCLであるホストoraHost上にあります。URLをTNSキーワード値形式で次のように記述します。

String myURL = 
   "jdbc:oracle:thin:@(description=(address_list=
   (address=(protocol=tcp)(port=1610)(host=webHost))
   (address=(protocol=tcp)(port=1521)(host=oraHost)))
   (connect_data=(INSTANCE_NAME=orcl))
   (source_route=yes))";
  OracleDataSource ods = new OracleDataSource();
  ods.setURL(myURL);
  ods.setUser("scott");
  ods.setPassword("tiger");
  Connection conn = ods.getConnection();

address_listエントリの先頭要素は、Connection Managerに対する接続を表します。2番目の要素は、接続するデータベースを表します。アドレスをリストする順序は重要です。

アプレットで前述のようなURLを使用した場合、そのアプレットはホストoraHost上のデータベースに直接接続したかのように機能します。

複数のConnection Manager経由の接続

アプレットは、複数のConnection Managerを経由してターゲット・データベースに接続することもできます。たとえば、Connection Managerがプロキシ連鎖を形成している場合があります。これを行うには、Connection Managerのアドレスをアクセスする順番にアドレス・リストに追加します。データベース・リスナーは、このリストの最後のアドレスにする必要があります。

署名付きアプレットの使用

Java Development Kit(JDK)1.2.xベース以上のブラウザでは、アプレットはソケット接続権限を要求し、Webサーバー・ホストとは異なるホストで動作しているデータベースに接続できます。Netscape 4.0以上では、アプレットに署名、つまり署名付きアプレットを記述することで、これを実行できます。次の手順を実行する必要があります。

  1. アプレットに署名します。アプレットに署名するために実行する必要のある手順については、次のWebサイトを参照してください。

    http://www.oracle.com/technetwork/java/index.html

  2. ソケットをオープンする前に適切な権限を要求するアプレット・コードを含めます。

    Netscapeを使用している場合は、コードに次のような文を含めます。

    netscape.security.PrivilegeManager.enablePrivilege("UniversalConnect"); 
    OracleDataSource ods = new OracleDataSource();
    ods.setURL("jdbc:oracle:thin:scott/tiger@dlsun511:1721:orcl");
    Connection conn = ods.getConnection();
    
  3. オブジェクト署名証明書を取得する必要があります。証明書の取得とインストールについての情報があるサイトを参照してください。

署名付きアプレットの例を含むJava Security APIについては、次のSun社のサイトを参照してください。

http://www.oracle.com/technetwork/java/javase/tech/index-jsp-136007.html

ファイアウォールとアプレットの使用方法

標準的な状況では、JDBC Thinドライバを使用したアプレットは、ファイアウォールを通過してデータベースにアクセスできません。一般的に、ファイアウォールは、権限を与えられていないクライアントによるサーバーへのアクセスを防ぐことを目的としています。データベースに接続しようとするアプレットに対し、ファイアウォールはデータベースへのTCP/IPソケットをオープンしないようにします。

一般に、ファイアウォールは規則に従っています。ファイアウォールには、接続が可能なクライアントと不可能なクライアントを定義する規則のリストがあります。ファイアウォールはこの規則とクライアントのホスト名を比較し、この比較に基づいてクライアントにアクセスを許可または禁止します。ホスト名の検索に失敗した場合、ファイアウォールは再度検索を試みます。今度は、クライアントのIPアドレスを抽出して、それを規則と比較します。ファイアウォールはこのように設計されているので、ユーザーはホスト名とIPアドレスを含んだ規則を指定できます。

ファイアウォールに関する問題は、Oracle Netに準拠したファイアウォールおよびそのファイアウォール構成に応じた接続文字列を使用することによって解決できます。Oracle Netに準拠したファイアウォールは、多数の主要なベンダーから入手できます。

署名付きでないアプレットは、そのアプレットのダウンロード元ホストにのみアクセスできます。この場合、そのホストには、Oracle Netに準拠したファイアウォールがインストールされている必要があります。これに対し、署名付きアプレットは任意のホストに接続できます。この場合、ターゲット・ホスト上のファイアウォールがアクセスを制御します。

ファイアウォールを通過して接続するには、次の項で説明する2つの処理を行う必要があります。

JDBC Thinドライバを使用するアプレット用のファイアウォールの構成

この項の説明では、Oracle Netに準拠したファイアウォールを実行していることを前提としています。

Javaアプレットはローカル・システムにはアクセスできません。セキュリティ上の制限のため、アプレットはローカル・システムでホスト名または環境変数を取得できません。この結果、JDBC Thinドライバはドライバが動作するホストのホスト名にアクセスできません。ファイアウォールにはホスト名が提供されません。JDBC Thinクライアントからの要求がファイアウォールを通過するには、ファイアウォールの規則のリストに対して次の操作が必要です。

  • JDBCアプレットが実行されているホストのIPアドレス(ホスト名ではない)を追加します。

  • ファイアウォールの規則内にホスト名「__jdbc__」が記述されていないことを確認します。このホスト名は、IPアドレスの検索を強制的に行うために、ドライバ内に模擬ホスト名としてハードコードされています。このホスト名を規則のリスト内に入力した場合は、JDBC Thinドライバを使用するすべてのアプレットがファイアウォールを通過できるようになります。

ファイアウォールを通過する接続のためのURLの記述

ファイアウォールを通過して接続できるURLを記述するには、接続先ファイアウォール・ホスト名およびデータベース・ホスト名を指定する必要があります。

たとえば、ポート1521をリスニングし、SIDがORCLであるホストoraHost上にあるデータベースに接続し、ポート1610をリスニングしているホストfireWallHost上にあるファイアウォールを通過する場合は、次のURLを使用します。

OracleDataSource ods = new OracleDataSource();
ods.setURL("jdbc:oracle:thin:" +
      "@(description=(address_list=" +
      (address=(protocol=tcp)(host=<firewall-host>)(port=1610))" +
      "(address=(protocol=tcp)(host=oraHost)(port=1521)))" +
      "(source_route=yes)" +
      "(connect_data=(SERVICE_NAME=orcl)))");
);
ods.setUser("scott");
ods.setPassword("tiger");
Connection conn = ods.getConnection();

注意:

ファイアウォールを通過して接続するために、host:port:sid構文内にURLを指定できません。たとえば、次のように指定したURLは機能しません
String connString =
   "jdbc:oracle:thin:@example.us.oracle.com:1521:orcl";

OracleDataSource ods = new OracleDataSource();
ods.setURL(connString);
ods.setUser("scott");
ods.setPassword("tiger");
Connection conn = ods.getConnection();

address_listの最初の要素は、ファイアウォールへの接続を表します。2番目の要素は、接続するデータベースを表します。アドレスを指定する順序が重要なので注意してください。

前述のURLは、次の形式でも記述できます。

String connString = 
      "jdbc:oracle:thin:@(description=(address_list=
      (address=(protocol=tcp)(port=1600)(host=fireWallHost))
      (address=(protocol=tcp)(port=1521)(host=oraHost)))
      (connect_data=(INSTANCE_NAME=orcl))
      (source_route=yes))";
OracleDataSource ods = new OracleDataSource();
ods.setURL(connString);
ods.setUser("scott");
ods.setPassword("tiger");
Connection conn = ods.getConnection();

前述のようなURLを使用するアプレットは、ホストoraHost上のデータベースに接続されているかのように動作します。


注意:

前述の例に示したすべてのパラメータが必要です。address_listでは、ファイアウォール・アドレスは、データベース・サーバー・アドレスよりも先に指定する必要があります。

アプレットのパッケージ化

アプレットのコーディング後は、パッケージ化してユーザーが利用できるようにする必要があります。アプレットをパッケージ化するには、アプレット・クラス・ファイルとojdbc5.jarファイルまたはojdbc6.jarファイルに含まれているJDBCドライバ・クラス・ファイルが必要です。

次の手順を実行します。

  1. JDBCドライバのクラス・ファイルojdbc5.jarまたはojdbc6.jarを空のディレクトリに移動します。

    アプレットがUS7ASCIIまたはWE8ISO8859P1以外のキャラクタ・セットのデータベースに接続してOracleオブジェクト型を使用する場合は、orai18n.jarファイルも同じディレクトリに移動します。

  2. アプレットのクラス・ファイルおよびアプレットで必要になる可能性のあるファイルをすべてこのディレクトリに追加します。

  3. アプレットのクラスおよびドライバのクラスをまとめて1つのZIPファイルまたはJavaアーカイブ(JAR)ファイルにします。この1つの圧縮ファイルには、次のものを入れてください。

    • ojdbc5.jarファイルまたはojdbc6.jarファイルからのクラス・ファイル、およびアプレットでグローバリゼーション・サポートが必要な場合は、orai18n.jarファイルから要求されたクラス・ファイル

    • アプレットのクラス

  4. ZIPファイルやJARファイルが圧縮されていないことを確認してください。

これでユーザーがアプレットを使用できるようになります。アプレットを利用するには、アプレットを実行するHTMLページにAPPLETタグを追加する方法があります。たとえば、次のようになります。

<APPLET WIDTH=500 HEIGHT=200 CODE=JdbcApplet ARCHIVE=JdbcApplet.zip 
      CODEBASE=Applet_Samples 
</APPLET>

HTMLページでのアプレットの指定

APPLETタグは、HTMLページのコンテキスト内で実行されるアプレットを指定します。APPLETタグには、CODEARCHIVECODEBASEWIDTHおよびHEIGHTの各属性を指定できます。次の各項では、これらの属性について説明します。

CODE、HEIGHTおよびWIDTH

アプレットを実行するHTMLページには、アプレット表示領域のサイズを指定する初期の幅および高さとともに、APPLETタグが必要です。ピクセル単位のサイズを指定するには、HEIGHTおよびWIDTH属性を使用します。サイズには、アプレットがオープンするウィンドウまたはダイアログ・ボックスのサイズは含めません。

APPLETタグには、アプレットのコンパイル済Appletサブクラスを含むファイルの名前も指定する必要があります。このファイル名はCODEパラメータで指定します。パスはすべてアプレットのベースURLの相対パスにする必要があります。絶対パスは使用できません。

次の例にあるJdbcApplet.classは、コンパイルされたアプレットの名前です。

<APPLET CODE="JdbcApplet" WIDTH=500 HEIGHT=200> 
</APPLET>

この形式のCODE属性を使用する場合は、アプレットおよびJDBC ThinドライバのためのクラスがこのHTMLページと同じディレクトリ内にある必要があります。


注意:

CODE属性には、ファイル拡張子.classを含めないでください。

CODEBASE

CODEBASE属性は省略可能です。この属性は、アプレットのベースURL、つまりアプレットのコードがあるディレクトリの名前を指定します。指定しない場合は、ドキュメントのURLが使用されます。つまり、アプレットおよびJDBC Thinドライバのためのクラスが、HTMLページと同じディレクトリ内にある必要があります。たとえば、現行ディレクトリがmy_Dirであるとします。

<APPLET WIDTH=500 HEIGHT=200 CODE=JdbcApplet CODEBASE="."
</APPLET>

属性CODEBASE="."は、このアプレットが現行ディレクトリmy_Dir内にあることを示します。

ここでは、次のようにCODEBASEの値がApplet_Samplesに設定されているとします。

<APPLET WIDTH=500 HEIGHT=200 CODE=JdbcApplet CODEBASE="Applet_Samples"
</APPLET>

これにより、アプレットは、ディレクトリmy_Dir/Applet_Samplesの中にあることになります。

ARCHIVE

ARCHIVE属性は省略可能です。この属性は、アプレットのクラスおよびそのアプレットに必要なリソースが格納されているアーカイブ・ファイルの名前を指定します。サーバーとの余計なラウンドトリップを大幅に削減できるため、アーカイブ・ファイルの使用をお薦めします。

アーカイブ・ファイルはあらかじめロードされます。リストに複数のアーカイブ・ファイルを指定する場合は、カンマで区切ります。次の例にあるクラス・ファイルは、アーカイブ・ファイルJdbcApplet.zipに格納されています。

<APPLET CODE="JdbcApplet" ARCHIVE="JdbcApplet.zip" WIDTH=500 HEIGHT=200>
</APPLET>

注意:

バージョン3.0のブラウザでは、ARCHIVE属性はサポートされていません。