WebLogic Type 4 JDBC ドライバ ガイド
以下の節では、BEA WebLogic Type 4 JDBC Oracle ドライバのコンフィグレーション方法と使用方法について説明します。
BEA WebLogic Type 4 JDBC Oracle ドライバ (「Oracle ドライバ」) は、Oracle 8i R3 (8.1.7)、Oracle9i R1 および R2、Oracle10g をサポートします。
BEA WebLogic Type 4 JDBC Oracle ドライバのドライバ クラスは次のとおりです。
XA : weblogic.jdbcx.oracle.OracleDataSource
非 XA : weblogic.jdbc.oracle.OracleDriver
WebLogic Server ドメインに JDBC データ ソースをコンフィグレーションする場合に、これらのドライバ クラスを使用します。
Oracle データベースに接続するには、次の形式の URL を使用します。
jdbc:bea:oracle://
dbserver
:
port
Oracle ドライバでも、接続のフェイルオーバの AlternateServers
オプションがサポートされています。「Connection Failover with AlternateServers」を参照してください。
表 6-1 に、Oracle ドライバでサポートされる JDBC 接続プロパティを示し、各プロパティについて説明します。WebLogic Server ドメインの JDBC データ ソースのコンフィグレーションでこれらの接続プロパティを使用できます。プロパティを指定するには、JDBC データ ソースのコンフィグレーションで次の形式を使用します。
property=value
注意 : すべての接続プロパティ名で大文字と小文字は区別されません。たとえば、Password は password と同じです。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tnsnames.ora ファイルは、各 Oracle サービスの接続情報を論理エイリアスにマップするために使用します。Oracle ドライバを使用すると、tnsnames.ora ファイルから以下のような基本的な接続情報を取得できます。
tnsnames.ora ファイルでは、Oracle サービスの接続情報がエイリアス (Oracle ネット サービス名) に関連付けられています。ネット サービス名の各エントリには、リスナやサービスの情報を定義する記述子が含まれています。コード リスト 6-1 に、ネット サービス名エントリである FITZGERALD.SALES および ARMSTRONG.ACCT をコンフィグレーションした tnsnames.ora ファイルの接続情報の例を示します。
FITZGERALD.SALES =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = server1)(PORT = 1521))
(CONNECT_DATA =
(SID = ORCL)
)
)
ARMSTRONG.ACCT =
(DESCRIPTION =
(ADDRESS_LIST=
(FAILOVER = on)
(LOAD_BALANCE = on)
(ADDRESS= (PROTOCOL = TCP)(HOST = server1)(PORT = 1521))
(ADDRESS= (PROTOCOL = TCP)(HOST = server2)(PORT = 1521))
(ADDRESS= (PROTOCOL = TCP)(HOST = server3)(PORT = 1521))
)
(CONNECT_DATA=
(SERVICE_NAME = acct.us.yourcompany.com)
)
)
この例では、Oracle ドライバが Oracle ネット サービス名エントリ FITGERALD.SALES を参照する場合、ドライバは Oracle SID ORCL (SID=ORCL
) に指定されている Oracle データベース インスタンスに接続します。同様に、Oracle ドライバが ARMSTRONG.ACCT を参照する場合は、サービス名 acct.us.yourcompany.com (SERVICE_NAME=acct.us.yourcompany.com
) に指定されている Oracle データベースに接続します。また、ドライバにより接続のフェイルオーバ (FAILOVER=on
) とクライアントのロード バランシング (LOAD_BALANCE=on
) が有効になります。
tnsnames.ora ファイルは、通常は Oracle データベースのインストール時にインストールされています。デフォルトでは、ORACLE_HOME\network\admin ディレクトリ (Windows の場合) または $ORACLE_HOME/network/admin ディレクトリ (UNIX) にあります。
Oracle ドライバで Oracle tnsnames.ora ファイルから接続情報を取得するには、どの tnsnames.ora ファイル (TNSNamesFile プロパティで指定) と、どの Oracle サービス名エントリ (TNSServerName プロパティで指定) を使用して接続情報を参照するかを指定する必要があります。次に例を示します。
jdbc:bea:oracle:TNSNamesFile=c:\oracle92\NETWORK\ADMIN\
tnsnames.ora;TNSServerName=FITZGERALD.SALES
この接続 URL では、接続に使用する tnsnames.ora ファイルのパスとファイル名 (TNSNamesFile=c:\oracle92\NETWORK\ADMIN\tnsnames.ora
)、およびネット サービス名エントリ (TNSServerName=FITZGERALD.SALES
) が指定されています。
tnsnames.ora ファイルと Java 2 のセキュリティ マネージャを併用する場合は、tnsnames.ora ファイルに読み込みパーミッションを付与する必要があります。「Oracle tnsnames.ora ファイルへのアクセス パーミッションを付与する」の例を参照してください。
tnsnames.ora ファイルを使用して接続情報を取得する場合は、接続情報の衝突を防ぐため、以下の接続プロパティは指定しないようにしてください。
TNSNamesFile および TNSServerName プロパティに加えてこれらのプロパティが指定されていると、ドライバで例外が生成されます。たとえば次の例に示すように、ネット サービス名エントリ ARMSTRONG.ACCT に LOAD_BALANCE パラメータを指定するとします。
ARMSTRONG.ACCT =
(DESCRIPTION =
(ADDRESS_LIST=
(FAILOVER = on)
(LOAD_BALANCE = on)
(ADDRESS= (PROTOCOL = TCP)(HOST = server1)(PORT = 1521))
(ADDRESS= (PROTOCOL = TCP)(HOST = server2)(PORT = 1521))
(ADDRESS= (PROTOCOL = TCP)(HOST = server3)(PORT = 1521))
)
)
この場合、次の例のようにドライバの接続 URL で LoadBalancing プロパティを指定すると、ドライバによって例外が生成されます。
jdbc:bea:oracle:TNSNamesFile=c:\\oracle92\\NETWORK\\ADMIN\\
tnsnames.ora;TNSServerName=FITZGERALD.SALES;LoadBalancing=true
表 6-2 に、Oracle ドライバ プロパティと tnsnames.ora 接続記述子パラメータの対応を示します。tnsnames.ora ファイルを使用する場合は、接続情報の衝突を防ぐため、表に示すドライバ プロパティは使用しないでください。
tnsnames.ora ファイルのコンフィグレーションの詳細については、Oracle のマニュアルを参照してください。
表 6-3 に、Oracle ドライバでサポートされるデータ型と、それらが JDBC データ型へどのようにマップされるかを示します。
データ型の詳細については、「getTypeInfo」を参照してください。
Oracle9i 以降では、日付および時刻のデータ型である TIMESTAMP、TIMESTAMP WITH LOCAL TIME ZONE、および TIMESTAMP WITH TIME ZONE がサポートされます。Oracle ドライバがこれらのデータ型をどのようにサポートしているかを理解するには、まず、Oracle ドライバが Oracle の日付および時刻のセッション パラメータに割り当てている値を理解しておく必要があります。
接続時には、Oracle ドライバが以下の日付および時刻のセッション パラメータを設定します。
|
Oracle の TIMESTAMP データ型は JDBC の TIMESTAMP データ型にマップされます。
Oracle の TIMESTAMP WITH LOCAL TIME ZONE データ型は TIMESTAMP JDBC データ型にマップされます。
TIMESTAMP WITH LOCAL TIME ZONE のカラムを取得する場合、ユーザに返される値は TIME_ZONE セッション パラメータで指定されるタイム ゾーンに変換されます。
TIMESTAMP WITH LOCAL TIME ZONE のカラムを設定する場合、
デフォルトでは、Oracle の TIMESTAMP WITH TIME ZONE データ型は VARCHAR JDBC データ型にマップされます。
TIMESTAMP WITH TIME ZONE 値を文字列として取得する (たとえば、resultSet.getString を使用する) 場合、その値は、タイム ゾーン情報を含むタイムスタンプの文字列表現として返されます。文字列情報の形式は、Oracle の NLS_TIMESTAMP_TZ_FORMAT セッション パラメータで指定された形式になります。
データベースに格納されたタイム ゾーン情報は、データがタイムスタンプに変換されるときに失われるため、デフォルトでは、TIMESTAMP WITH TIME ZONE 値をタイムスタンプとして取得する (たとえば、resultSet.getTimeStamp を使用する) ことはサポートされていません。既存のアプリケーションとの下位互換性を保つために、FetchTSWTZasTimestamp プロパティを使用して、TIMESTAMP WITH TIME ZONE 値をタイムスタンプとして取得することができます。FetchTSWTSasTimestamp プロパティのデフォルト値は false です。false の場合は TIMESTAMP WITH TIME ZONE 値をタイムスタンプとして取得できません。
TIMESTAMP WITH TIME ZONE のカラムを設定する場合、
Oracle ドライバは、Oracle9i 以降で XMLType として指定されたカラムを含むテーブルをサポートします。Oracle の XMLType データ型は JDBC CLOB データ型にマップされます。XMLType カラムは他のカラム型と同様にクエリで使用できます。XMLType カラムのデータは String、Clob、CharacterStream、または AsciiStream として取得できます。XMLType カラムを挿入または更新する場合、挿入または更新されるカラムは XMLType データ型の形式でなければなりません。
Oracle には、XMLType データ オブジェクトを作成するための xmltype() 関数があります。xmltype() 関数の xmlData 引数は、文字列リテラルまたはパラメータ マーカとして指定できます。パラメータ マーカを使用する場合、パラメータ値は setString、setClob、setCharacterStream、または setAsciiStream メソッドを使用して設定できます。
次のコードでは、xmltype() 関数の xmlData 引数として文字列リテラルを指定した文を使用して、XMLType カラムにデータを挿入します。
// xml データをリテラルとして挿入する
String sql = "insert into XMLTypeTbl values (1, xmltype('" +
"<emp><empNo>123</empNo><empName>Mark</empName></emp>'))";
Statement stmt = con.createStatement();
stmt.executeUpdate(sql);
次のコードでは、Prepared Statement を使用して XMLType カラムにデータを挿入します。
// xml データを文字列パラメータとして挿入する
String xmlStr = "<emp><empNo>234</empNo><empName>Trish</empName></emp>";
String sql = "insert into XMLTypeTbl values (?, xmltype(?))";
PreparedStatement prepStmt = con.prepareStatement(sql);
prepStmt.setInt(1, 2);
prepStmt.setString(2, xmlStr);
prepStmt.executeUpdate();
XMLType カラムのデータを Clob として取得する場合、その Clob オブジェクトを使用して XMLType データを更新することはできません。XMLType カラムから返された Clob オブジェクトの setString、setCharacterStream、または setAsciiStream メソッドを呼び出すと、SQLException が生成されます。
REF CURSOR は、カーソル変数用の Oracle データ型です。JDBC はカーソル変数データ型をサポートしていないため、Oracle ドライバでは REF CURSOR 出力パラメータを返し、値を結果セットとしてアプリケーションに返します。Oracle ドライバは、REF CURSOR データを自動的に結果セットに変換します。結果セットは、getResultSet または getMoreResults で取得できます。REF CURSOR データが出力パラメータではなく結果セットとして返されるため、DatabaseMetaData.getProcedureColumns 呼び出しの結果には REF CURSOR 出力パラメータは含まれません。
作成するアプリケーションでは、以下の例に示すように、REF CURSOR のパラメータ マーカは省略し、REF CURSOR の出力パラメータを宣言しないようにしてください。これらの例では、次のストアド プロシージャ定義を参照しています。
CREATE PACKAGE foo_pkg AS
TYPE EmpCurTyp IS REF CURSOR RETURN fooTbl%ROWTYPE;"
PROCEDURE selectEmployeeManager(empId IN INT, empCursor OUT EmpCurTyp,
mgrCursor out EmpCurTyp);
FUNCTION selectEmployee2 (empId IN INT) return EmpCurTyp;
END foo_pkg;
コード リスト 6-2 REF Cursor の例 1 : 単一の REF CURSOR を返すストアド プロシージャを呼び出す
// 入力パラメータを受け付ける関数を呼び出し、
// 戻り値として REF CURSOR を返す。refcursor 戻り値
// パラメータのプレースホルダは省略する。
// REF CURSOR は結果セットとして返される
sql = "{call foo_pkg.selectEmployee2(?)}";
callStmt = con.prepareCall(sql);
callStmt.setInt(1, 2);
moreResults = callStmt.execute();
while (true) {
if (moreResults) {
// REF CURSOR を表す結果セットを取得する
resultSet = callStmt.getResultSet();
displayResults(resultSet);
resultSet.close();
resultSet = null;
System.out.println();
}
else {
updateCnt = callStmt.getUpdateCount();
if (updateCnt == -1) {
break;
}
System.out.println("Update Count: " + updateCnt);
}
moreResults = callStmt.getMoreResults();
}
コード リスト 6-3 REF Cursor の例 2 : 複数の REF CURSOR を返すストアド プロシージャを呼び出す
// 入力パラメータを受け付けるストアド プロシージャを呼び出し、
// 2 つの REF CURSOR を返す。REF CURSOR パラメータのプレースホルダは
// 省略する。REF CURSOR は結果セットとして
// 返される
sql = "{call foo_pkg.selectEmployeeManager(?)}";
callStmt = con.prepareCall(sql);
callStmt.setInt(1, 2);
moreResults = callStmt.execute();
while (true) {
if (moreResults) {
// REF CURSOR を表す結果セットを取得する
resultSet = callStmt.getResultSet();
displayResults(resultSet);
resultSet.close();
}
else {
updateCnt = callStmt.getUpdateCount();
if (updateCnt == -1) {
break;
}
}
moreResults = callStmt.getMoreResults();
}
Oracle ドライバでサポートされている SQL エスケープ シーケンスの詳細については、「JDBC の SQL エスケープ シーケンス」を参照してください。
Oracle ドライバは、アイソレーション レベルとして Read Committed および Serializable をサポートしています。デフォルトは Read Committed です。
Oracle ドライバは、スクロールセンシティブな結果セット、スクロールインセンシティブな結果セット、および更新可能な結果セットをサポートしています。
注意 : Oracle ドライバが、要求された結果セットのタイプまたは同時実行性をサポートできない場合は、カーソルを自動的にダウングレードして詳細情報の入った SQLWarning を生成します。
JDBC 分散トランザクションを JTA 経由で使用するには、Oracle8.1.7 以降が必要となります。
Oracle ドライバは、バッチ処理をサポートするための 2 つのメカニズムを備えています。
BatchPerformanceWorkaround プロパティによって、使用するバッチ メカニズムが決まります。BatchPerformanceWorkaround プロパティの値が true の場合はネイティブの Oracle バッチ メカニズムが使用されます。それ以外の場合は JDBC 3.0 に準拠したメカニズムが使用されます。BatchPerformanceWorkaround プロパティのデフォルト値は false です。
Oracle ドライバは、以下の形式の SQL のパラメータ メタデータを返すことができます。
INSERT INTO foo VALUES (?, ?, ?)
INSERT INTO foo (col1, col2, col3) VALUES (?, ?, ?)
UPDATE foo SET col1=?, col2=?, col3=?WHERE col1
operator
?[{AND | OR} col2
operator
?]
ここで、operator
は SQL 演算子 (=
、<
、>
、<=
、>=
、または <>
) です。
Oracle ドライバは自動生成キーの値の取得をサポートします。Oracle ドライバから返される自動生成キーは、ROWID 擬似カラムの値です。
値を返す方法は、パラメータを含む Insert 文を使用しているかどうかによって異なります。
アプリケーションは Statement.getGeneratedKeys メソッドを使用して、生成されたキーの値をドライバから取得します。
Oracle ドライバでは、プライマリ サーバが接続を受け付けない場合に接続を試行する代替データベース サーバのリストを指定できます。接続の試行は、接続が正常に確立されるか、リスト内のすべてのデータベース サーバが指定した回数試されるまで続きます。
プライマリ サーバと代替サーバの接続情報は、接続 URL を使用して指定できます。たとえば、次に示す Oracle ドライバの接続 URL では、プライマリ サーバと代替サーバの接続情報を指定しています。
jdbc:bea:oracle://server1:1521;ServiceName=TEST;User=test;
Password=secret;AlternateServers=(server2:1521;ServiceName=TEST2,
server3:1521;ServiceName=TEST3)
...server1:1521;ServiceName=TEST...
この部分は、プライマリ サーバの接続情報を指定する接続 URL です。代替サーバは AlternateServers プロパティを使用して指定します。次に例を示します。
...;AlternateServers=(server2:1521;ServiceName=TEST2,
server3:1521;ServiceName=TEST3)
tnsnames.ora ファイルを使用してプライマリ サーバや代替サーバの接続情報を指定する方法については、「tnsnames.ora ファイルを使用する」を参照してください。
代替サーバの接続情報は、接続 URL の AlternateServers プロパティを使用して指定します。AlternateServers プロパティの値は、次のような形式の文字列です。
(servername1
[:port1
][;property
=value
],servername2
[:port2
]
[;property
=value
],...)
servername1
は、1 番目の代替データベース サーバのサーバ名です。servername2
2 番目の代替データベース サーバのサーバ名です。3 番目以降も同様です。サーバ名は、代替サーバのエントリごとに必ず指定する必要があります。
port1
は、1 番目の代替データベース サーバがリスンするポート番号です。port2
は、2 番目の代替データベース サーバがリスンするポート番号です。3 番目以降も同様です。各代替サーバ エントリのポート番号は省略可能です。省略した場合は、プライマリ サーバに指定されているポート番号が使用されます。プライマリ サーバのポート番号が指定されていない場合は、デフォルトのポート番号 (1521) が使用されます。
property
=
value
は、接続プロパティである ServiceName または SID のいずれかです。各代替サーバ エントリの接続プロパティは省略可能かつ相互排他的です。次に例を示します。
jdbc:bea:oracle://server1:1521;ServiceName=TEST;User=test;
Password=secret;AlternateServers=(server2:1521;ServiceName=TEST2,
server3:1521)
jdbc:bea:oracle://server1:1521;SID=ORCL;User=test;Password=secret;
AlternateServers=(server2:1521;SID=ORCL2,server3:1521)
代替サーバ エントリの接続プロパティを省略した場合、その代替サーバへの接続にはプライマリ サーバに指定されているプロパティが使用されます。たとえば、次の URL のようにプライマリ サーバに SID=ORCL を指定し、代替サーバ エントリで SID を指定しない場合、ドライバはプライマリ サーバに指定されている SID を使用して、代替サーバの ORCL データベースへの接続を試行します。
jdbc:bea:oracle://server1:1521;SID=ORCL;User=test;Password=secret;
AlternateServers=(server2:1521,server3:1521)
接続の再試行を指定すると、Oracle ドライバはデータベース サーバ (プライマリおよび代替) への接続を確立できるまでリスト内のデータベース サーバへの接続を再試行します。接続の再試行を有効にして制御するには、ConnectionRetryCount プロパティと ConnectionRetryDelay プロパティを使用します。次に例を示します。
jdbc:bea:oracle://server1:1521;ServiceName=TEST;User=test;
Password=secret;AlternateServers=(server2:1521;ServiceName=TEST2,
server3:1521;ServiceName=TEST3);ConnectionRetryCount=2;
ConnectionRetryDelay=5
この例では、Oracle ドライバがリスト内のデータベース サーバ (プライマリおよび代替) への試行を一巡しても接続が確立できない場合は、リスト内のサーバを同じ順序であと 2 回再試行します (ConnectionRetryCount=2
)。つまり、再試行の一巡目で接続が確立できない場合は、サーバのリストをもう一巡再試行するということです。接続再試行の遅延が 5 秒 (ConnectionRetryDelay=5
) に設定されているので、ドライバは再試行と再試行の間に 5 秒間待機します。
表 6-4 に、Oracle ドライバでの接続のフェイルオーバを制御するための接続プロパティをまとめます。各プロパティのコンフィグレーションの詳細については、表 6-1 を参照してください。
「Connection Failover with AlternateServers」および「Client Load Balancing」で、接続フェイルオーバとクライアントのロード バランシングの概要について参照してください。
Oracle ドライバでは、プライマリ サーバが接続を受け付けない場合に接続を試行する代替データベース サーバのリストを指定できます。接続の試行は、接続が正常に確立されるか、リスト内のすべてのデータベース サーバが指定した回数試されるまで続きます。
プライマリ サーバと代替サーバの接続情報は、接続 URL を使用して指定できます。たとえば、次に示す Oracle ドライバの接続 URL では、プライマリ サーバと代替サーバの接続情報を指定しています。
jdbc:bea:oracle://server1:1521;ServiceName=TEST;User=test;
Password=secret;AlternateServers=(server2:1521;ServiceName=TEST2,
server3:1521;ServiceName=TEST3)
...server1:1521;ServiceName=TEST...
この部分では、プライマリ サーバの接続情報を指定しています。代替サーバは AlternateServers プロパティを使用して指定します。次に例を示します。
...;AlternateServers=(server2:1521;ServiceName=TEST2,
server3:1521;ServiceName=TEST3)
tnsnames.ora ファイルを使用してプライマリ サーバや代替サーバの接続情報を指定する方法については、「tnsnames.ora ファイルを使用する」を参照してください。
代替サーバの接続情報は、接続 URL の AlternateServers プロパティを使用して指定します。AlternateServers プロパティの値は、次のような形式の文字列です。
(servername1
[:port1
][;property
=value
],servername2
[:port2
]
[;property
=value
],...)
servername1
は、1 番目の代替データベース サーバのサーバ名です。servername2
2 番目の代替データベース サーバのサーバ名です。3 番目以降も同様です。サーバ名は、代替サーバのエントリごとに必ず指定する必要があります。
port1
は、1 番目の代替データベース サーバがリスンするポート番号です。port2
は、2 番目の代替データベース サーバがリスンするポート番号です。3 番目以降も同様です。各代替サーバ エントリのポート番号は省略可能です。省略した場合は、プライマリ サーバに指定されているポート番号が使用されます。プライマリ サーバのポート番号が指定されていない場合は、デフォルトのポート番号 (1521) が使用されます。
property
=
value
は、接続プロパティである ServiceName または SID のいずれかです。各代替サーバ エントリの接続プロパティは省略可能かつ相互排他的です。次に例を示します。
jdbc:bea:oracle://server1:1521;ServiceName=TEST;User=test;
Password=secret;AlternateServers=(server2:1521;ServiceName=TEST2,
server3:1521)
jdbc:bea:oracle://server1:1521;SID=ORCL;User=test;Password=secret;
AlternateServers=(server2:1521;SID=ORCL2,server3:1521)
代替サーバ エントリの接続プロパティを省略した場合、その代替サーバへの接続にはプライマリ サーバに指定されているプロパティが使用されます。たとえば、次の URL のようにプライマリ サーバに SID=ORCL を指定し、代替サーバ エントリで SID を指定しない場合、ドライバはプライマリ サーバに指定されている SID を使用して、代替サーバの ORCL データベースへの接続を試行します。
jdbc:bea:oracle://server1:1521;SID=ORCL;User=test;Password=secret;
AlternateServers=(server2:1521,server3:1521)
接続の再試行を指定すると、Oracle ドライバはデータベース サーバ (プライマリおよび代替) への接続を確立できるまでリスト内のデータベース サーバへの接続を再試行します。接続の再試行を有効にして制御するには、ConnectionRetryCount プロパティと ConnectionRetryDelay プロパティを使用します。次に例を示します。
jdbc:bea:oracle://server1:1521;ServiceName=TEST;User=test;
Password=secret;AlternateServers=(server2:1521;ServiceName=TEST2,
server3:1521;ServiceName=TEST3);ConnectionRetryCount=2;
ConnectionRetryDelay=5
この例では、Oracle ドライバがリスト内のデータベース サーバ (プライマリおよび代替) への試行を一巡しても接続が確立できない場合は、リスト内のサーバを同じ順序であと 2 回再試行します (ConnectionRetryCount=2
)。つまり、再試行の一巡目で接続が確立できない場合は、サーバのリストをもう一巡再試行するということです。接続再試行の遅延が 5 秒 (ConnectionRetryDelay=5
) に設定されているので、ドライバは再試行と再試行の間に 5 秒間待機します。
表 6-5 に、Oracle ドライバでの接続のフェイルオーバを制御するための接続プロパティをまとめます。各プロパティのコンフィグレーションの詳細については、表 6-1 を参照してください。
「Connection Failover with AlternateServers」および「Client Load Balancing」で、接続フェイルオーバとクライアントのロード バランシングの概要について参照してください。