5 JDBC Thin固有の機能
この章では、Java Database Connectivity(JDBC)Thinクライアントの概要、およびJDBC Thinドライバのみでサポートされている機能について説明します。Oracle JDBCアプレットを使用する上での基本情報も提供します。この章の内容は次のとおりです。
5.1 JDBC Thinクライアントの概要
JDBCシン・クライアントは、Pure Javaのタイプ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インスタンスまたは同じデータベースの別のセッションへのアクセスに使用されます。
5.2 サポートされるその他の機能
JDBC Thinドライバは、標準JDBC機能のすべてをサポートします。JDBC Thinドライバは、次の追加機能に対するサポートも提供しています。
5.2.1 ネイティブXAのデフォルトでのサポート
JDBC Thinドライバには、JDBC OCIドライバと同様にネイティブXAに対するサポートが用意されています。ただし、JDBC ThinドライバはデフォルトでネイティブXAをサポートします。この点は、ネイティブXAのサポートをデフォルトでは使用できないJDBC OCIドライバと異なります。
関連項目:
5.2.2 トランザクション・ガードのサポート
トランザクション・ガード機能は、計画済および計画外の停止と重複発行の際に、実行を最大1回とするための汎用インフラストラクチャを提供します。トランザクション・ガード機能を(アプリケーション・コンティニュイティ機能とともに)使用すると、透過的なセッション・リカバリと、処理中のトランザクションの初めからSQL文(問合せおよびDML)のリプレイが可能になります。
関連項目:
5.2.3 アプリケーション・コンティニュイティのサポート
アプリケーション・コンティニュイティは、汎用目的のアプリケーションから独立したインフラストラクチャを提供します。これにより、計画済または計画外の停止発生後にアプリケーションからの作業のリカバリが可能になります。これには、次の利点があります。
-
エンドユーザーから停止をマスク
-
ユーザー環境、処理中のトランザクションおよび失われた結果のリカバリ
-
アプリケーションがリカバリするための単一の容易で確実なメソッド
-
停止の有無にかかわらず、アプリケーションによるターゲットとの応答時間が明確
関連項目:
5.2.4 アプレットのサポート
このJDBC Thinドライバは、アプレットに対するサポートを提供する唯一のOracle JDBCドライバです。このドライバは、ブラウザで実行するJavaアプレットとともにダウンロードできます。
ノート:
JDBC Thinドライバをアプレットと併用する場合は、クライアント側で使用するブラウザがJavaソケットをサポートしている必要があります。
HTTPプロトコルはステートレスで、通常はネットワークを介した通信に使用されます。ただし、JDBC Thinドライバはステートレスではありません。したがって、アプレットおよびJDBC Thinドライバをダウンロードする最初のHTTP要求はステートレスになります。JDBC Thinドライバがデータベース接続を確立すると、ブラウザとデータベース間の通信はステートフルになり、2層構成となります。
関連項目:
5.3 アプレット内のJDBC
アプレットには、Oracle JDBC Thinドライバのみを使用できます。この項では、アプレットをデータベースに接続するために必要な操作について説明します。これには、Webサーバーとは別のホストで動作しているデータベースに接続する場合に、Oracle DatabaseのConnection Manager機能または署名付きアプレットを使用する方法が含まれます。また、ファイアウォールを通過してアプレットをデータベースに接続する方法についても説明します。最後に、アプレットをパッケージ化およびデプロイする方法について説明します。
内容は次のとおりです。
5.3.1 アプレットを介したデータベースへの接続について
JDBCドライバを使用したアプレットの最も一般的な作業は、データベースへの接続と問合せです。アプレットのセキュリティ上の制限のため、特定のステップを実行せずにアプレットがオープンできるのは、ダウンロード元のホストへのTCP/IPソケットのみです。この場合のホストは、Webサーバーが実行されているホストを意味します。つまり、これらのステップを行わない場合、アプレットが接続できるのは、Webサーバーと同じホスト上で動作するデータベースのみです。
データベースとWebサーバーが同じホストで動作している場合は、問題はなく、特別なステップは必要ありません。アプリケーションから接続する場合と同様に、データベースに接続できます。
アプリケーションから接続する場合と同様に、接続情報をドライバに指定する方法は2つあります。host:port:service_name
の形式またはTNSキーワード値構文の形式で指定できます。
たとえば、接続するデータベースが、localost
(ポート5221
にあり、サービス名がorcl
)に存在し、ユーザー名をHR
、パスワードをhr
として接続する場合は、次のいずれかの接続文字列を使用します。
-
host:port:service_name
構文を使用する場合は、次のようになります。String connString="jdbc:oracle:thin:@localhost:5221:orcl"; OracleDataSource ods = new OracleDataSource(); ods.setURL(connString); ods.setUser("HR"); ods.setPassword("hr"); Connection conn = ods.getConnection();
-
TNSキーワード値構文を使用する場合は、次のようになります。
String connString = "jdbc:oracle:thin:@(description=(address_list=(address=(protocol=tcp) (port=5221)(host=localHost)))(connect_data=(INSTANCE_NAME=orcl)))"; OracleDataSource ods = new OracleDataSource(); ods.setURL(connString); ods.setUser("HR"); ods.setPassword("hr"); Connection conn = ods.getConnection();
TNSキーワード値ペアを使用してJDBC Thinドライバに接続情報を指定する場合は、プロトコルをTCPとして宣言する必要があります。
ただし、Webサーバーとデータベース・サーバーは、いずれも多くのリソースを必要とします。両方のサーバーが同じコンピュータ上で実行されることはほとんどありません。通常、アプレットはWebサーバーが実行されているホストとは別のホスト上のデータベースに接続します。別のコンピュータで実行中のデータベースにアプレットで接続するには、次の方法があります。
-
ホスト・コンピュータ上でOracle Connection Managerを使用します。アプレットをConnection Managerに接続し、Connection Managerから別のコンピュータ上のデータベースに接続します。
アプレットで、Oracle DatabaseのAdvanced Securityオプションのデータ暗号化および整合性チェックサム機能も利用できます。
5.3.2 Webサーバーとは異なるホスト上のデータベースへの接続
Webサーバーが動作しているホスト以外のホスト上のデータベースに接続する場合は、アプレットのセキュリティの制限に対処する必要があります。次の方法で対処できます。
5.3.2.1 Oracle Connection Managerの使用
この項では、次の概念について説明します。
5.3.2.1.1 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およびデータベースの関係を示しています。
Oracle Connection Managerを使用するには、次のような2つのステップを実行する必要があります。
5.3.2.1.2 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
ノート:
Oracle Connection Managerのインストール中、認証済ユーザーとしてOracle Connection Managerサービスを実行することを選択した場合、cmctl
コマンドを実行すると、パスワードの入力を要求されます。ただし、Oracle Connection Managerサービスをローカル・サービス・アカウントとして実行することを選択した場合、cmctl
コマンドを実行しても、パスワードの入力は要求されません。
アプレットを使用するには、この時点でアプレット用の接続文字列を記述する必要があります。
5.3.2.1.3 Connection ManagerをターゲットにしたURLの記述
ここでは、アプレットがConnection Managerに接続し、Connection Managerがデータベースに接続するようにURLを記述する方法について説明します。URLには、Connection Managerが実行されているWebサーバー・ホストのプロトコル、ポートおよびホスト名を示したアドレス・リストの後に、データベースが実行されているホストのプロトコル、ポートおよびホスト名を指定します。
次の例では、図5-1で示した構成について説明します。Connection Managerを実行しているWebサーバーは、ホストwebHost
にあり、ポート1610
をリスニングしています。接続対象のデータベースは、ポート5221
をリスニングし、サービス名がorcl
であるホストoraHost
上にあります。URLをTNSキーワード値形式で次のように記述します。
String myURL = "jdbc:oracle:thin:@(description=(address_list= (address=(protocol=tcp)(port=1610)(host=webHost)) (address=(protocol=tcp)(port=5221)(host=oraHost))) (connect_data=(INSTANCE_NAME=orcl)) (source_route=yes))"; OracleDataSource ods = new OracleDataSource(); ods.setURL(myURL); ods.setUser("HR"); ods.setPassword("hr"); Connection conn = ods.getConnection();
address_list
エントリの先頭要素は、Connection Managerに対する接続を表します。2番目の要素は、接続するデータベースを表します。アドレスをリストする順序は重要です。
アプレットで前述のようなURLを使用した場合、そのアプレットはホストoraHost
上のデータベースに直接接続したかのように機能します。
5.3.2.2 署名付きアプレットの使用
Java Development Kit(JDK)1.2.xベース以上のブラウザでは、アプレットはソケット接続権限を要求し、Webサーバー・ホストとは異なるホストで動作しているデータベースに接続できます。Netscape 4.0以上では、アプレットに署名、つまり署名付きアプレットを記述することで、これを実行できます。次のステップを実行する必要があります。
署名付きアプレットの例を含むJava Security APIの詳細は、次のサイトを参照してください。
http://www.oracle.com/technetwork/java/javase/tech/index-jsp-136007.html
5.3.3 ファイアウォールとアプレットの使用の概要
標準的な状況では、JDBC Thinドライバを使用したアプレットは、ファイアウォールを通過してデータベースにアクセスできません。一般的に、ファイアウォールは、権限を与えられていないクライアントによるサーバーへのアクセスを防ぐことを目的としています。データベースに接続しようとするアプレットに対し、ファイアウォールはデータベースへのTCP/IPソケットをオープンしないようにします。
一般に、ファイアウォールは規則に従っています。ファイアウォールには、接続が可能なクライアントと不可能なクライアントを定義する規則のリストがあります。ファイアウォールはこの規則とクライアントのホスト名を比較し、この比較に基づいてクライアントにアクセスを許可または禁止します。ホスト名の検索に失敗した場合、ファイアウォールは再度検索を試みます。今度は、クライアントのIPアドレスを抽出して、それを規則と比較します。ファイアウォールはこのように設計されているので、ユーザーはホスト名とIPアドレスを含んだ規則を指定できます。
ファイアウォールに関する問題は、Oracle Netに準拠したファイアウォールおよびそのファイアウォール構成に応じた接続文字列を使用することによって解決できます。Oracle Netに準拠したファイアウォールは、多数の主要なベンダーから入手できます。
署名付きでないアプレットは、そのアプレットのダウンロード元ホストにのみアクセスできます。この場合、そのホストには、Oracle Netに準拠したファイアウォールがインストールされている必要があります。これに対し、署名付きアプレットは任意のホストに接続できます。この場合、ターゲット・ホスト上のファイアウォールがアクセスを制御します。
ファイアウォールを通過して接続するには、次の項で説明する2つのステップが必要です。
5.3.3.1 JDBC Thinドライバを使用するアプレット用のファイアウォールの構成
この項の説明では、Oracle Netに準拠したファイアウォールを実行していることを前提としています。
Javaアプレットはローカル・システムにはアクセスできません。セキュリティ上の制限のため、アプレットはローカル・システムでホスト名または環境変数を取得できません。この結果、JDBC Thinドライバはドライバが動作するホストのホスト名にアクセスできません。ファイアウォールにはホスト名が提供されません。JDBC Thinクライアントからの要求がファイアウォールを通過するには、ファイアウォールの規則のリストに対して次の操作が必要です。
-
JDBCアプレットが実行されているホストのIPアドレス(ホスト名ではない)を追加します。
-
ファイアウォールの規則内にホスト名「
__jdbc__
」が記述されていないことを確認します。このホスト名は、IPアドレスの検索を強制的に行うために、ドライバ内に模擬ホスト名としてハードコードされています。このホスト名を規則のリスト内に入力した場合は、JDBC Thinドライバを使用するすべてのアプレットがファイアウォールを通過できるようになります。
5.3.3.2 ファイアウォールを通過する接続のためのURLの記述
ファイアウォールを通過して接続できるURLを記述するには、接続先ファイアウォール・ホスト名およびデータベース・ホスト名を指定する必要があります。
たとえば、ポート5221
をリスニングし、サービス名が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=5221)))" + "(source_route=yes)" + "(connect_data=(service_name=orcl)))"); ); ods.setUser("HR"); ods.setPassword("hr"); Connection conn = ods.getConnection();
ノート:
ファイアウォールを通過して接続するために、host:port:service_name
構文内にURLを指定できません。たとえば、次のように指定したURLは機能しません。
String connString =
"jdbc:oracle:thin:@example.us.oracle.com:5221:orcl";
OracleDataSource ods = new OracleDataSource(); ods.setURL(connString); ods.setUser("HR"); ods.setPassword("hr"); 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=5221)(host=oraHost))) (connect_data=(INSTANCE_NAME=orcl)) (source_route=yes))"; OracleDataSource ods = new OracleDataSource(); ods.setURL(connString); ods.setUser("HR"); ods.setPassword("hr"); Connection conn = ods.getConnection();
前述のようなURLを使用するアプレットは、ホストoraHost
上のデータベースに接続されているかのように動作します。
ノート:
前述の例に示したすべてのパラメータが必要です。address_list
では、ファイアウォール・アドレスは、データベース・サーバー・アドレスよりも先に指定する必要があります。
5.3.4 アプレットのパッケージ化
アプレットのコーディング後は、パッケージ化してユーザーが利用できるようにする必要があります。アプレットをパッケージ化するには、アプレット・クラス・ファイルとojdbc6.jar
ファイルまたはojdbc7.jar
ファイルに含まれているJDBCドライバ・クラス・ファイルが必要です。
次のステップを実行します。
これでユーザーがアプレットを使用できるようになります。アプレットを利用するには、アプレットを実行するHTMLページにAPPLET
タグを追加する方法があります。次に例を示します。
<APPLET WIDTH=500 HEIGHT=200 CODE=JdbcApplet ARCHIVE=JdbcApplet.zip CODEBASE=Applet_Samples </APPLET>
5.3.5 HTMLページでのアプレットの指定の概要
5.3.5.1 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
を含めないでください。
5.3.5.2 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
の中にあることになります。
5.3.5.3 ARCHIVE
ARCHIVE
属性は省略可能です。この属性は、アプレットのクラスおよびそのアプレットに必要なリソースが格納されているアーカイブ・ファイルの名前を指定します。サーバーとの余計なラウンドトリップを大幅に削減できるため、アーカイブ・ファイルの使用をお薦めします。
アーカイブ・ファイルはあらかじめロードされます。リストに複数のアーカイブ・ファイルを指定する場合は、カンマで区切ります。次の例にあるクラス・ファイルは、アーカイブ・ファイルJdbcApplet.zip
に格納されています。
<APPLET CODE="JdbcApplet" ARCHIVE="JdbcApplet.zip" WIDTH=500 HEIGHT=200> </APPLET>
ノート:
バージョン3.0のブラウザでは、ARCHIVE
属性はサポートされていません。