この章では、Java Database Connectivity(JDBC)Thinクライアントの概要、およびJDBC Thinドライバのみでサポートされている機能について説明します。Oracle JDBCアプレットを使用する上での基本情報も提供します。この章では、次の項目について説明します。
JDBC Thinクライアントは、pure JavaのType IVドライバです。このドライバは軽量で、インストールも簡単です。このドライバは、JDBC Oracle Call Interface(OCI)ドライバのパフォーマンスに匹敵する高いパフォーマンスを提供します。JDBC Thinドライバは、すべてJavaで記述されており、プラットフォームに依存しません。また、クライアント側に追加のOracleソフトウェアは必要ありません。
JDBC ThinドライバはTTCを使用してサーバーと通信します。TTCは、Oracle DatabaseのデータにアクセスするためにOracleが開発したプロトコルです。アプリケーション・サーバーにも、アプレットにも使用できます。このドライバを使用すると、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層構成となります。
JDBC Thinドライバには、JDBC OCIドライバと同様にネイティブXAに対するサポートが用意されています。ただし、JDBC ThinドライバはデフォルトでネイティブXAをサポートします。この点は、ネイティブXAのサポートをデフォルトでは使用できないJDBC OCIドライバと異なります。
アプレットには、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サーバーが動作しているホスト以外のホスト上のデータベースに接続する場合は、アプレットのセキュリティの制限に対処する必要があります。次の方法で対処できます。
Oracle Connection Managerは、Oracle Netパケットを受信して別のサーバーに再転送できる軽量でスケーラブルなプログラムです。Oracle Netを実行するクライアントからは、Connection Managerはまるでデータベース・サーバーのように見えます。JDBC Thinドライバを使用するアプレットは、Webサーバー・ホスト上で実行中のConnection Managerに接続し、Connection Managerを使用して、Oracle Netパケットを異なるホスト上で動作するOracleサーバーにリダイレクトできます。
図5-1に、アプレット、Oracle 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以上では、アプレットに署名、つまり署名付きアプレットを記述することで、これを実行できます。次の手順を実行する必要があります。
アプレットに署名します。アプレットに署名する手順の詳細は、Sun社のWebサイトを参照してください。
ソケットをオープンする前に適切な権限を要求するアプレット・コードを含めます。
Netscapeを使用している場合は、コードに次のような文を含めます。
netscape.security.PrivilegeManager.enablePrivilege("UniversalConnect"); OracleDataSource ods = new OracleDataSource(); ods.setURL("jdbc:oracle:thin:scott/tiger@dlsun511:1721:orcl"); Connection conn = ods.getConnection();
オブジェクト署名証明書を取得する必要があります。証明書の取得とインストールについての情報があるサイトを参照してください。
署名付きアプレットの例を含むJava Security APIについては、次のSun社のサイトを参照してください。
標準的な状況では、JDBC Thinドライバを使用したアプレットは、ファイアウォールを通過してデータベースにアクセスできません。一般的に、ファイアウォールは、権限を与えられていないクライアントによるサーバーへのアクセスを防ぐことを目的としています。データベースに接続しようとするアプレットに対し、ファイアウォールはデータベースへのTCP/IPソケットをオープンしないようにします。
一般に、ファイアウォールは規則に従っています。ファイアウォールには、接続が可能なクライアントと不可能なクライアントを定義する規則のリストがあります。ファイアウォールはこの規則とクライアントのホスト名を比較し、この比較に基づいてクライアントにアクセスを許可または禁止します。ホスト名の検索に失敗した場合、ファイアウォールは再度検索を試みます。今度は、クライアントのIPアドレスを抽出して、それを規則と比較します。ファイアウォールはこのように設計されているので、ユーザーはホスト名とIPアドレスを含んだ規則を指定できます。
ファイアウォールに関する問題は、Oracle Netに準拠したファイアウォールおよびそのファイアウォール構成に応じた接続文字列を使用することによって解決できます。Oracle Netに準拠したファイアウォールは、多数の主要なベンダーから入手できます。
署名付きでないアプレットは、そのアプレットのダウンロード元ホストにのみアクセスできます。この場合、そのホストには、Oracle Netに準拠したファイアウォールがインストールされている必要があります。これに対し、署名付きアプレットは任意のホストに接続できます。この場合、ターゲット・ホスト上のファイアウォールがアクセスを制御します。
ファイアウォールを通過して接続するには、次の項で説明する2つの処理を行う必要があります。
この項の説明では、Oracle Netに準拠したファイアウォールを実行していることを前提としています。
Javaアプレットはローカル・システムにはアクセスできません。セキュリティ上の制限のため、アプレットはローカル・システムでホスト名または環境変数を取得できません。この結果、JDBC Thinドライバはドライバが動作するホストのホスト名にアクセスできません。ファイアウォールにはホスト名が提供されません。JDBC Thinクライアントからの要求がファイアウォールを通過するには、ファイアウォールの規則のリストに対して次の操作が必要です。
JDBCアプレットが実行されているホストのIPアドレス(ホスト名ではない)を追加します。
ファイアウォールの規則内にホスト名「__jdbc__
」が記述されていないことを確認します。このホスト名は、IPアドレスの検索を強制的に行うために、ドライバ内に模擬ホスト名としてハードコードされています。このホスト名を規則のリスト内に入力した場合は、JDBC Thinドライバを使用するすべてのアプレットがファイアウォールを通過できるようになります。
ファイアウォールを通過して接続できる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は動作しません。
|
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ドライバ・クラス・ファイルが必要です。
次の手順を実行します。
JDBCドライバのクラス・ファイルojdbc5.jar
またはojdbc6.jar
を空のディレクトリに移動します。
アプレットがUS7ASCII
またはWE8ISO8859P1
以外のキャラクタ・セットのデータベースに接続してOracleオブジェクト型を使用する場合は、orai18n.jar
ファイルも同じディレクトリに移動します。
アプレットのクラス・ファイルおよびアプレットで必要になる可能性のあるファイルをすべてこのディレクトリに追加します。
アプレットのクラスおよびドライバのクラスをまとめて1つのZIPファイルまたはJavaアーカイブ(JAR)ファイルにします。この1つの圧縮ファイルには、次のものを入れてください。
ojdbc5.jar
ファイルまたはojdbc6.jar
ファイルからのクラス・ファイル、およびアプレットでグローバリゼーション・サポートが必要な場合は、orai18n.jar
ファイルから要求されたクラス・ファイル
アプレットのクラス
ZIPファイルまたはJARファイルが圧縮されていないことを確認します。
これでユーザーがアプレットを使用できるようになります。アプレットを利用するには、アプレットを実行するHTMLページにAPPLET
タグを追加する方法があります。たとえば、次のようになります。
<APPLET WIDTH=500 HEIGHT=200 CODE=JdbcApplet ARCHIVE=JdbcApplet.zip CODEBASE=Applet_Samples </APPLET>
APPLET
タグは、HTMLページのコンテキスト内で実行されるアプレットを指定します。APPLET
タグには、CODE
、ARCHIVE
、CODEBASE
、WIDTH
およびHEIGHT
の各属性を指定できます。次の各項では、これらの属性について説明します。
アプレットを実行する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
属性は省略可能です。この属性は、アプレットのベース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
属性は省略可能です。この属性は、アプレットのクラスおよびそのアプレットに必要なリソースが格納されているアーカイブ・ファイルの名前を指定します。サーバーとの余計なラウンドトリップを大幅に削減できるため、アーカイブ・ファイルの使用をお薦めします。
アーカイブ・ファイルはあらかじめロードされます。リストに複数のアーカイブ・ファイルを指定する場合は、カンマで区切ります。次の例にあるクラス・ファイルは、アーカイブ・ファイルJdbcApplet.zip
に格納されています。
<APPLET CODE="JdbcApplet" ARCHIVE="JdbcApplet.zip" WIDTH=500 HEIGHT=200> </APPLET>
注意: バージョン3.0のブラウザでは、ARCHIVE 属性はサポートされていません。 |