1 アプリケーションでのWebLogic JDBCの使い方

WebLogic Server管理コンソールを使用して、JDBC汎用データ・ソース、マルチ・データ・ソースまたはActive GridLinkデータ・ソースなどのWebLogic Serverの機能を有効化、構成および監視する方法を学習します。JMX APIおよびWebLogic Scripting Tool (WLST)を使用して、同じタスクをプログラム的に実行できます。構成後の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 - HighestNumWaitersConnectionReserveTimeoutSecondsなどのデータ・ソースについて構成されたしきい値が原因で、接続を取得するアプリケーション・リクエストが失敗すると生成されます。

  • 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モジュールからのデータベース接続の取得を参照してください。