1 アプリケーションでのWebLogic JDBCの使い方
『Oracle WebLogic Server JDBCデータソースの管理』のJDBCデータソースの構成に関する項を参照してください。
DataSourceオブジェクトからのデータベース接続の取得
DataSourceオブジェクトからのデータベース接続のリクエストについて学習します。
DataSourceオブジェクトにアクセスするパッケージのインポート
アプリケーションでDataSourceオブジェクトを使用するには、以下のクラスをクライアント・コードにインポートします。
import java.sql.*; import java.util.*; import javax.naming.*;
DataSourceを使用したクライアント接続の取得
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 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コードを使用する場合は、接続をプールに返す前に、その設定を受け入れ可能な状態に戻す必要があります。
アプリケーション・スコープのデータ・ソースからの接続の取得
エンタープライズ・アプリケーションでパッケージ化されたJDBCモジュールから接続を取得するには、ローカル環境またはJNDIツリーで、JDBCモジュール内に定義されたデータ・ソースを検索し、データ・ソースまたはマルチ・データ・ソースからの接続をリクエストします。
アプリケーション・スコープのデータ・ソースから接続を取得するには、Oracle WebLogic Server JDBCデータ・ソースの管理のパッケージ化されたJDBCモジュールからのデータベース接続の取得を参照してください。