この章では、Java Database Connectivity(JDBC)Oracle Call Interface(OCI)ドライバ固有の機能について説明します。OCI Instant Clientについても説明します。この章では、次の項目について説明します。
OCI接続プーリング機能は、Oracleが設計した拡張機能です。JDBC OCIドライバで提供される接続プーリングによって、アプリケーションは少数の物理接続を使用して、複数の論理接続を保持できます。この論理接続でのコールは、指定された時間に使用可能な物理接続にルーティングされます。
クライアント結果キャッシュ機能により、クライアント側でのSQL問合せ結果セットのクライアント・メモリーへのキャッシュが可能になります。このようにして、OCIアプリケーションでは、クライアント・メモリーを使用することで、繰返しの問合せのレスポンス時間を改善するためにクライアント結果キャッシュを利用できます。
結果がクライアント結果キャッシュに格納されることを示すために、問合せに/*+ result_cache */
のヒントで注釈を付ける必要があります。たとえば、次のコードを見てみます。
String query = "select /*+ result_cache */ * from emp where empno < : 1"; ((oracle.jdbc.OracleConnection)conn).setImplicitCachingEnabled(true); ((oracle.jdbc.OracleConnection)conn).setStatementCacheSize(10); PreparedStatement pstmt; ResultSet rs; for (int j = 0 ; j < 10 ; j++ ) { pstmt = conn.prepareStatement (query); pstmt.setInt(1,7500); rs = pstmt.executeQuery(); while (rs.next( ) ) { // see the values } rs.close; pstmt.close( ) ; } }
この例では、クライアント結果キャッシュのヒント/*+ result_cache */
が、実際の問合せであるselect * from emp where empno < : 1
に注釈として付けられています。したがって、問合せは最初にデータベースに対して実行され、その結果セットが、問合せの残り9回の実行用にキャッシュされます。これにより、アプリケーションのパフォーマンスは大幅に向上します。
関連項目: 『Oracle Call Interfaceプログラマーズ・ガイド』 |
JDBC OCIクライアント結果キャッシュを使用する際は、JDBC文キャッシュを使用するか、またはキャッシュ文をアプリケーション・レベルで使用する必要があります。
JDBC OCIドライバの透過的アプリケーション・フェイルオーバー機能を使用すると、接続先のデータベース・インスタンスがダウンした場合でも、データベースに自動的に再接続できます。別のノードで作成されても、新しいデータベース接続は元の接続とまったく同じです。
この項には、次の項目が含まれます。
Instant Client機能を使用すると、Oracleホームの必要性がなくなり、OCI、Oracle C++ Call Interface(OCCI)、Open Database Connectivity(ODBC)およびJDBC-OCIベースのカスタマ・アプリケーションのデプロイが非常に簡単になります。Instant Clientモードで実行するJDBC OCIアプリケーションに必要な記憶域の容量は、クライアント側に完全にインストールして実行するアプリケーションに比べて少なくなります。Instant Clientの共有ライブラリに使用されるディスク領域は、クライアント側に完全にインストールした場合の約1/4です。
表6-1は、JDBC OCIアプリケーションのデプロイに必要なOracleのクライアント側ファイルを示しています。この表では、リリース11.1のライブラリ名を使用しています。ライブラリ名の数字の部分は、リリースに応じて将来変更されます。
表6-1 OCI Instant Client共有ライブラリ
LinuxシステムとUNIXシステム | LinuxシステムとUNIXシステムの場合の記述 | Microsoft Windows | Microsoft Windowsの場合の記述 |
---|---|---|---|
|
クライアント・コード・ライブラリ |
|
アプリケーションがリンクする各機能の転送 |
|
OCI Instant Clientデータ共有ライブラリ |
|
データとコード |
|
セキュリティ・ライブラリ |
|
セキュリティ・ライブラリ |
|
OCI Instant Client JDBCライブラリ |
|
OCI Instant Client JDBCライブラリ |
すべてのJDBC Javaアーカイブ(JAR)ファイル |
関連項目: 「環境変数の確認」 |
すべてのJDBC JARファイル |
関連項目: 「環境変数の確認」 |
注意: ネイティブXA機能を提供するには、JDBC XAクラス・ライブラリをコピーする必要があります。UNIXシステムでは、このライブラリlibheteroxa11.so はORACLE_HOME /jdbc/lib ディレクトリに格納されています。Microsoft Windowsでは、このライブラリheteroxa11.dll はORACLE_HOME \bin ディレクトリに格納されています。 |
Instant Clientには次のような利点があります。
インストール時にコピーされるファイルの数がそれほど多くありません。
Oracleのクライアント側で必要なファイルの数と合計ディスク領域が大幅に減少します。
Instant Clientでデプロイされたアプリケーションでは、機能またはパフォーマンスに損失がありません。
サード・パーティのソフトウェア・ベンダーがアプリケーションを簡単にパッケージ化できます。
Instant Clientライブラリは、Oracle Universal InstallerでInstant Clientオプションを選択するとインストールできます。Oracle Technology Network JapanのWebサイトからダウンロードすることもできます。インストールの手順は、次のとおりです。
Instant Client共有ライブラリおよびOracle JDBCクラス・ライブラリをダウンロードし、instantclient
などのディレクトリにインストールします。
ライブラリ・パスの環境変数を、手順1のディレクトリに設定します。たとえば、UNIXシステムでは、LD_LIBRARY_PATH
環境変数をinstantclient
に設定します。Microsoft Windowsでは、PATH
環境変数をinstantclient
ディレクトリに設定します。
CLASSPATH
環境変数に、JDBCクラス・ライブラリの完全パス名を追加します。
これで、JDBC OCIアプリケーションを実行する準備が整いました。
JDBC OCIアプリケーションは、ライブラリ・パスの環境変数を介してOCI共有ライブラリおよびJDBC共有ライブラリにアクセスできる場合、Instant Clientモードで動作します。Instant ClientモードではORACLE_HOME
への依存性はなく、ORACLE_HOME
に用意されている他のコードおよびデータ・ファイルは、tnsnames.ora
ファイルを除いて、JDBC OCIには不要です。
Instant Clientは、Oracle Universal InstallerでInstant Clientオプションを選択するとインストールできます。Instant Clientファイルは、必ず空のディレクトリにインストールしてください。Instant Clientモードで動作するには、OTNのインストールと同じように、LD_LIBRARY_PATH
環境変数をInstant Clientディレクトリに設定する必要があります。
管理者
オプションを選択して完全なクライアント・インストールを実行した場合は、Instant Client共有ライブラリもインストールされます。完全なクライアント・インストールでは、Instant Client共有ライブラリおよびJDBCクラスは次の場所に格納されます。
LinuxシステムまたはUNIXシステムの場合:
libociei.so
ライブラリは、$ORACLE_HOME/instantclient
に格納されます。
libclnstsh.so.11.1
、libocijdbc11.so
およびlibnnz11.so
は、$ORACLE_HOME/lib
に格納されます。
JDBCクラス・ライブラリは、$ORACLE_HOME/jdbc/lib
に格納されます。
Microsoft Windowsの場合:
oraociei11.dll
ライブラリはORACLE_HOME\instantclient
に格納されます。
oci.dll
、ocijdbc11.dll
およびorannzsbb11.dll
は、ORACLE_HOME\bin
に格納されます。
JDBCクラス・ライブラリはORACLE_HOME\jdbc\lib
に格納されます。
これらのファイルを別のディレクトリにコピーし、そのディレクトリにライブラリ・パスを設定し、JDBCクラス・ライブラリのパス名をCLASSPATH
環境変数に追加すると、JDBC OCIアプリケーションをInstant Clientモードで実行できます。
注意:
|
Instant Clientはデプロイメント用の機能であるため、本番アプリケーションの実行に使用します。デプロイメントでは、デモ用のプログラムなどにアクセスできるようにするために、完全インストールが必要です。一般的に、Instant Clientモードがクライアント側動作専用でないかぎり、Instant Clientモードで実行されているアプリケーションではすべてのJDBC OCI機能を使用できます。したがって、サーバー側の外部プロシージャは、Instant Clientモードでは動作しません。
Instant Clientはデプロイメント用の機能であるため、JDBC OCIアプリケーションの実行に必要なファイルの数とサイズの減少に重点が置かれています。したがって、Instant Client共有ライブラリのパッチに必要なすべてのファイルがInstant Clientのデプロイ時に揃っているわけではありません。Instant Client共有ライブラリのパッチには、ORACLE_HOME
ベースの完全クライアント・インストールが必要です。opatch
ユーティリティを使用して、Instant Client共有ライブラリにパッチを適用します。
注意: Microsoft Windowsでは、共有ライブラリにパッチを適用できません。 |
ORACLE_HOME
環境でパッチを適用した後、表6-1「OCI Instant Client共有ライブラリ」にリストされているファイルをInstant Clientディレクトリにコピーします。「JDBC OCI Instant Clientのインストール手順」を参照してください。
個々のファイルをコピーするのではなく、OCI、OCCI、JDBCおよびSQL*PlusにInstant Client ZIPファイルを作成できます。「データ共有ライブラリとZIPファイルの再生成」を参照してください。その後、これらの各ZIPファイルをターゲット・コンピュータにコピーして解凍します。「JDBC OCI Instant Clientのインストール手順」を参照してください。
opatch
ユーティリティは、libclnstsh.so.11.1
にORACLE_HOME
インストールのパッチ情報を格納します。次のコマンドを使用すると、この情報を取り出すことができます。
genezi -v
Instant Clientのデプロイ元のコンピュータにgenezi
ユーティリティが装備されていない場合、ORACLE_HOME
インストールが装備されたコンピュータ上のORACLE_HOME
/bin
ディレクトリからコピーする必要があります。
ORACLE_HOME
を管理者オプションでインストールした場合は、次の手順を実行して、OCI Instant Clientデータ共有ライブラリ(libociei.so
)を再生成できます。
mkdir -p $ORACLE_HOME/rdbms/install/instantclient/light cd $ORACLE_HOME/rdbms/lib make -f ins_rdbms.mk ilibociei
ORACLE_HOME
内の現行ファイルに基づく新しいバージョンのlibociei.so
データ共有ライブラリが、ORACLE_HOME
/rdbms/install/instantclient
ディレクトリに配置されます。
再生成したデータ共有ライブラリlibociei.so
の場所は、元のデータ共有ライブラリlibociei.so
の場所と異なるので注意が必要です。元のデータ共有ライブラリlibociei.so
は、ORACLE_HOME
/instantclient
ディレクトリに配置されています。前述の手順を実行すると、OCI、OCCI、JDBCおよびSQL*Plusに対応したInstant Client ZIPファイルも生成されます。
Microsoft Windowsプラットフォームでは、データ共有ライブラリとZIPファイルを再生成することはできません。
tnsnames.ora
やsqlnet.ora
などの構成ファイルの格納先としてORACLE_HOME
またはTNS_ADMIN
環境変数を使用しないOracle Netネーミング・メソッドは、すべてInstant Clientモードで動作します。特に、接続文字列は次のような形式で指定できます。
次のようなThin形式の接続文字列の場合:
host:port:service_name
たとえば、次のようになります。
url="jdbc:oracle:oci:@//example.com:5521:bjava21"
次のようなSQL接続URL文字列の場合:
//host:[port][/service name]
たとえば、次のようになります。
url="jdbc:oracle:oci:@//example.com:5521/bjava21
Oracle Netのキーワードと値のペアについては、たとえば、次のようになります。
url="jdbc:oracle:oci:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp) (HOST=dlsun242) (PORT=5521)) (CONNECT_DATA=(SERVICE_NAME=bjava21)))"
構成ファイルの格納先としてTNS_ADMIN
が必要なネーミング・メソッドをそのまま使用するには、TNS_ADMIN
環境変数を設定します。
関連項目: 接続フォーマットの詳細は、『Oracle Database Net Services管理者ガイド』を参照してください。 |
TNS_ADMIN
環境変数を設定せずに、inst1
などのTNSNAMES
エントリを使用する場合は、ORACLE_HOME
環境変数を設定し、構成ファイルを$ORACLE_HOME/network/admin
ディレクトリに格納する必要があります。
注意: この場合、ORACLE_HOME 環境変数は、Oracle Net構成ファイルの格納先としてのみ使用されます。それ以外のクライアント・コード・ライブラリでは、ORACLE_HOME 環境変数の値は使用されません。 |
空の接続文字列はサポートされていません。ただし、空の接続文字列を使用可能にする代替方法はあります。UNIXシステムではTWO_TASK
環境変数を、Microsoft WindowsではLOCAL
変数を、tnsnames.ora
エントリまたはOracle Netのキーワードと値のペアのいずれかに設定します。TWO_TASK
またはLOCAL
をtnsnames.ora
エントリに設定すると、tnsnames.ora
ファイルをTNS_ADMIN
またはORACLE_HOME
の設定によってロードする必要があります。
例
データベース・サーバー上のlistener.ora
ファイルに次の情報が格納されているとします。
LISTENER = (ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(HOST=server6)(PORT=1573))) SID_LIST_LISTENER = (SID_LIST= (SID_DESC=(SID_NAME=rdbms3) (GLOBAL_DBNAME=rdbms3.server6.us.alchemy.com) (ORACLE_HOME=/home/dba/rdbms3/oracle)))
このサーバーには、次のいずれかの方法で接続できます。
url = "jdbc:oracle:oci:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp) (HOST=server6)(PORT=1573)) (CONNECT_DATA=(SERVICE_NAME=rdbms3.server6.us.alchemy.com)))"
または
url = "jdbc:oracle:oci:@//server6:1573/rdbms3.server6.us.alchemy.com"
または、TWO_TASK
環境変数を任意の接続文字列に設定すれば、sqlplus
コマンドとともに接続文字列を指定しなくても、データベース・サーバーに接続できます。たとえば、次の方法のいずれかを使用してTWO_TASK
環境変数を設定します。
setenv TWO_TASK "(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=server6)(PORT=1573)) (CONNECT_DATA=(SERVICE_NAME=rdbms3.server6.us.alchemy.com)))"
または
setenv TWO_TASK //server6:1573/rdbms3.server6.us.alchemy.com
これで、次のURLを使用すると、データベース・サーバーに接続できます。
url = "jdbc:oracle:oci:@"
接続文字列は、tnsnames.ora
ファイルに格納できます。たとえば、tnsnames.ora
ファイルに次の情報が格納されているとします。
conn_str = (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=server6)(PORT=1573)) (CONNECT_DATA=(SERVICE_NAME=rdbms3.server6.us.alchemy.com)))
このtnsnames.ora
ファイルが/home/webuser/instantclient
ディレクトリに配置されている場合、次のように、TNS_ADMIN
環境変数(または、Microsoft WindowsではLOCAL
)を設定できます。
setenv TNS_ADMIN /home/webuser/instantclient
これで、次のように接続できます。
url = "jdbc:oracle:oci:@conn_str"
注意: TNS_ADMIN 環境変数では、tnsnames.ora ファイルが配置されているディレクトリを指定します。ただし、TNS_ADMIN では、tnsnames.ora ファイルのフルパスを指定するのではなく、ディレクトリを指定します。 |
このtnsnames.ora
ファイルが、Oracleホームの/network/server6/home/dba/oracle/network/admin
ディレクトリに配置されている場合、TNS_ADMIN
を使用してtnsnames.ora
ファイルを配置するかわりに、次のようにORACLE_HOME
環境変数を使用できます。
setenv ORACLE_HOME /network/server6/home/dba/oracle
これで、先に指定したように、接続文字列conn_str
のいずれかを使用して接続できます。
TNS_ADMIN
またはORACLE_HOME
によってtnsnames.ora
を特定できる場合、TWO_TASK
は次のように設定できます。
setenv TWO_TASK conn_str
次のURLで接続できます。
url = "jdbc:oracle:oci:@"
ORACLE_HOME
環境変数は、グローバリゼーション・サポート・ファイルおよびエラー・メッセージ・ファイルの場所の指定には使用されません。OCI専用のアプリケーションでは、ORACLE_HOME
環境変数を設定する必要はありません。ただし、変数を設定しても、OCIドライバの動作には影響ありません。OCIはデータを常にデータ共有ライブラリから取得します。ORACLE_HOME
環境変数は、データ共有ライブラリを使用できない場合にのみ使用されます。この場合は、完全クライアント・インストールが前提となります。ORACLE_HOME
環境変数の設定は不要であっても、設定する場合は、ディレクトリを識別する有効なオペレーティング・システムのパス名に設定する必要があります。
Instant Clientモードの場合、環境変数ORA_NLS10
およびORA_NLSPROFILES33
は無視されます。
Instant Clientモードでは、ORA_TZFILE
変数を使用しない場合、サイズの小さいデフォルトのtimezone.dat
ファイルがデータ共有ライブラリから使用されます。サイズの大きいtimezlrg.dat
ファイルをデータ共有ライブラリから使用する場合は、絶対または相対パス名を付けずに、このファイルの名前をORA_TZFILE
環境変数に設定します。つまり、次のように設定します。
UNIXシステムの場合:
setenv ORA_TZFILE timezlrg.dat
Microsoft Windowsの場合:
set ORA_TZFILE timezlrg.dat
ドライバがInstant Clientモードで動作しない場合、ORA_TZFILE
変数を設定する際は、以前のOracle Databaseのリリースのときと同様に完全パス名を指定します。
TNSNAMES
のエントリを使用する場合は、前述のように、TNS_ADMIN
ディレクトリにTNSNAMES
構成ファイルを格納する必要があります。TNS_ADMIN
を設定しない場合は、ORACLE_HOME/network/admin
ディレクトリにOracle Net Services構成ファイルを格納する必要があります。
軽量バージョンのInstant Clientは、Instant Client Light(English)と呼ばれます。Instant Client Lightはその略称です。Instant Client Lightは、Instant Clientを大幅に軽量化したバージョンです。Instant Client Lightを使用することで、クライアント・インストールに必要なディスク領域が約63MB少なくなります。UNIXシステムの場合、これは、軽量データ共有ライブラリlibociicus.so
によって実現されます。このライブラリは、サイズが4MBであり、データ共有ライブラリlibociei.so
(サイズは67MB)のサブセットです。
この軽量データ共有ライブラリは、少数のキャラクタ・セットとエラー・メッセージを英語のみでサポートしています。そのため、Instant Client Light(English)という名前が付いています。Instant Client Lightは、英語のエラー・メッセージのみを必要とし、US7ASCIIかWE8DEC、またはUnicodeキャラクタ・セットの1つを使用するアプリケーションに対応して設計されています。
表6-2に、様々なプラットフォームにおけるInstant ClientとInstant Client Light(English)用のデータ共有ライブラリ名をリストします。この表では、各データ共有ライブラリのサイズをライブラリ・ファイル名に続くカッコ内に記載しています。
表6-2 Instant ClientとInstant Client Light(English)用のデータ共有ライブラリ
プラットフォーム | Instant Client | Instant Client Light(English) |
---|---|---|
Sun Solaris |
|
|
Linux |
|
|
Microsoft Windows |
|
|
この項には、次の項目が含まれます。
NLS_LANG
設定は、言語、地域およびキャラクタ・セットをlanguage
_
territory
.
characterset
で判断します。Instant Client Lightでは、language
はAmerican
のみであり、territory
はサポートされる地域すべてが対象です。characterset
は、次のいずれか1つになります。
シングルバイト
US7ASCII
WE8DEC
WE8MSWIN1252
WE8ISO8859P1
Unicode
UTF8
AL16UTF16
AL32UTF8
クライアントやサーバーのキャラクタ・セットとしてリストされている以外のキャラクタ・セットまたは各国語キャラクタ・セットを指定したり、クライアントのNLS_LANG
に言語を設定したりすると、次のエラーが発生します。
ORA-12734
ORA-12735
ORA-12736
ORA-12737
Instant Client Lightでは、エラー・メッセージは英語でのみ出力されます。したがって、NLS_LANG
設定に有効な値は、次のようになります。
American_territory.characterset
territory
にはサポートされる有効な地域を、characterset
には前述のいずれかのキャラクタ・セットを指定できます。
Instant Client Lightは、OCI_UTF16モードで作成されたOCI環境ハンドルを使用して動作します。
関連項目: NLS設定の詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。 |
Instant Client Lightモードで動作するには、アプリケーションで、UNIXシステムの場合はLD_LIBARARY_PATH
環境変数を、Microsoft Windowsの場合はPATH
環境変数を、クライアントおよびデータ共有ライブラリが格納されている場所に設定する必要があります。OCIアプリケーションは、デフォルトでOCIデータ共有ライブラリ、つまりUNIXシステムではLD_LIBRARY_PATH
環境変数のlibociei.so
、Microsoft WindowsではPATH
環境変数のoraociei11.dll
データ共有ライブラリを検索して、アプリケーションがInstant Clientモードで動作するかどうかを判断します。このライブラリが見つからない場合、OCIは、Instant Client Lightのデータ共有ライブラリ、つまりUNIXシステムではlibociicus.so
、Microsoft Windowsではlibociicus11.dll
をロードしようとします。このライブラリが見つかった場合、アプリケーションはInstant Client Lightモードで動作します。このライブラリが見つからない場合は、Instant Client以外のモードとなります。
Instant Client Lightは、次のいずれかの方法でインストールできます。
OTNから
次のサイトから必要なファイルをダウンロードできます。
http://www.oracle.com/technology/tech/oci/instantclient/instantclient.html
Instant Client Lightの場合は、Basicパッケージをダウンロードして展開するかわりに、Basic Lightパッケージをダウンロードして解凍します。解凍する前に、軽量ライブラリを解凍するinstantclient_11_1
ディレクトリを空にしてください。
インストールされたクライアント(管理者)から
libociei.so
またはoraociei11.dll
をORACLE_HOME
/instantclient
ディレクトリからコピーするかわりに、libociicus.so
またはoraociic10.dll
をORACLE_HOME
/instantclient/light
ディレクトリからコピーします。つまり、UNIXシステムの場合、LD_LIBRARY_PATH
環境変数のInstant Clientディレクトリに、大規模なOCI Instant Clientのデータ共有ライブラリlibociei.so
ではなく、Instant Client Lightのデータ共有ライブラリlibociicus.so
を格納してください。Microsoft Windowsの場合、PATH
環境変数にはoraociei11.dll
ではなくoraociei11.dll
を指定する必要があります。
Oracle Universal Installerから
Oracle Universal InstallerでInstant Clientオプションを選択すると、libociei.so
(Microsoft Windowsの場合はoraociei11.dll
)が、インストールのベース・ディレクトリにインストールされ、LD_LIBRARY_PATH
環境変数には、このディレクトリが指定されます。このため、Instant Client Lightはデフォルトでは使用できません。Instant Client Lightのデータ共有ライブラリlibociicus.so
(Microsoft Windowsの場合はoraociicus11.dll
)は、ベース・ディレクトリのlight
サブディレクトリにインストールされます。したがって、Instant Client Lightモードで動作するには、OCIデータ共有ライブラリlibociei.so
(Windowsではoraociei11.dll
)を削除するか、名前を変更し、Instant Client Lightのデータ共有ライブラリを、インストールのlight
サブディレクトリからベース・ディレクトリにコピーする必要があります。
たとえば、Oracle Universal Installerで、Instant ClientをLD_LIBRARY_PATH
環境変数のmy_oraic_11_1
ディレクトリにインストールした場合、Instant Client Lightモードで動作するには、次のようにします。
cd my_oraic_11_1 rm libociei.so mv light/libociicus.so .
注意: Instant Clientファイルは、必ず空のディレクトリにコピーまたはインストールしてください。これは、インストール時に互換性のないバイナリが存在しないようにするためです。 |