JDBCデータ・ソースの構成の詳細は、『Oracle WebLogic Server JDBCデータ・ソースの管理』を参照してください。
DataSourceオブジェクトからのデータベース接続のリクエストについて説明します。
アプリケーションでDataSourceオブジェクトを使用するには、以下のクラスをクライアント・コードにインポートします。
import java.sql.*; import java.util.*; import javax.naming.*;
JDBCクライアント用に接続を取得するには、以下のコードに示すように、Java Naming and Directory Interface (JNDI)ルックアップを使用してDataSourceオブジェクトを見つけます。
注意:
クライアント側アプリケーションでJDBC接続を使用する際、サーバーとクライアントの両方のCLASSPATHに、同一のJDBCドライバ・クラスを指定する必要があります。ドライバ・クラスが一致していないと、java.rmi.UnmarshalException例外がスローされる場合があります。
Context ctx = null;
Hashtable ht = new Hashtable();
ht.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
ht.put(Context.PROVIDER_URL,
"t3://hostname:port");
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
ctx = new InitialContext(ht);
javax.sql.DataSource ds
= (javax.sql.DataSource) ctx.lookup ("myDataSource");
conn = ds.getConnection();
// You can now use the conn object to create
// Statements and retrieve result sets:
stmt = conn.createStatement();
stmt.execute("select * from someTable");
rs = stmt.getResultSet();
...
//Close JDBC objects as soon as possible
stmt.close();
stmt=null;
conn.close();
conn=null;
}
catch (Exception e) {
// a failure occurred
log message;
}
finally {
try {
ctx.close();
} catch (Exception e) {
log message; }
try {
if (rs != null) rs.close();
} catch (Exception e) {
log message; }
try {
if (stmt != null) stmt.close();
} catch (Exception e) {
log message; }
try {
if (conn != null) conn.close();
} catch (Exception e) {
log message; }
}
(使用するWebLogic Serverに合わせて適切なhostnameとport番号に置き換えます。)
注意:
前述のコードでは、JNDIコンテキストを取得するために、使用可能な数件のプロシージャの1つが使用されています。JNDIの詳細は、『Oracle WebLogic Server JNDIアプリケーションの開発』を参照してください。
weblogic.jdbc.extensionsパッケージには、アプリケーション・リクエストの失敗時にスローされ得る以下の例外が含まれています。各例外は、java.sql.SQLExceptionの拡張です。
ConnectionDeadSQLException - 予約された接続に対する接続テストに失敗したことが原因で、接続を取得するアプリケーション・リクエストが失敗すると生成されます。通常は、データベース・サーバーが利用できない場合に生じます。
ConnectionUnavailableSQLException - 割り当てられるべきプール内に現在利用できる接続がなかったことが原因で、接続を取得するアプリケーション・リクエストが失敗すると生成されます。これは一時的なエラーであって、プール内の接続がすべて使用中の場合に生成されます。また、接続がテスト中であるために使用できない場合にもスローされることがあります。
PoolDisabledSQLException - JDBCデータ・ソースが管理者によって無効にされたことが原因で、接続を取得するアプリケーション・リクエストが失敗すると生成されます。
PoolLimitSQLException - HighestNumWaiters、ConnectionReserveTimeoutSecondsなどのデータ・ソースについて構成されたしきい値が原因で、接続を取得するアプリケーション・リクエストが失敗すると生成されます。
PoolPermissionsSQLException - 接続を取得するアプリケーション・リクエストで、(セキュリティ)認証または認可チェックが失敗すると生成されます。
データ・ソース内のプールされた接続を使用している場合に、DBMS固有のSQLコードが実行されることがあります。これにより、WebLogic ServerおよびJDBCドライバからは認識されない形式でデータベース接続のプロパティが変更されます。接続がプールに返されたときに、その接続の特性の設定が有効な状態に戻らないことがあります。
注意:
たとえばSybase DBMSで、「set rowcount 3 select * from y」などの文を使用すると、接続に対する後続の問合せでは最大で3行までしか返されません。接続がプールに返されてから再利用された場合、選択対象の表に500の行があっても、接続の次のユーザーには引続き3行のみが返されます。
データ・ソース内のプールされた接続を使用している場合に、DBMS固有のSQLコードが実行されることがあります。これはデータベース接続のプロパティを変更するものであり、WebLogic ServerおよびJDBCドライバからは認識されません。接続がプールに返されたときに、その接続の特性の設定が有効な状態に戻らないことがあります。たとえばSybase DBMSで、「set rowcount 3 select * from y」などの文を使用すると、接続に対する後続の問合せでは最大で3行までしか返されません。接続がプールに返されてから再利用された場合、選択対象の表に500の行があっても、接続の次のユーザーには引続き3行のみが返されます。
ほとんどの場合、同じ結果をもたらすことができる標準のJDBCコードが存在します。この例では、set rowcountの代わりにsetMaxRows()を使用できます。DBMS固有のSQLコードの代わりに標準のJDBCコードを使用することをお薦めします。標準のJDBC呼出しを使用して接続を変更すると、接続がデータ・ソースに返された時点で接続が標準の状態に戻ります。
接続を変更するベンダー固有のSQLコードを使用する場合は、接続をプールに返す前に、その設定を受け入れ可能な状態に戻す必要があります。