ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JDBC プログラマーズ ガイド
11g リリース 1 (10.3.1)
B55535-01
 

目次
目次

戻る
戻る
 
次へ
次へ
 

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

WebLogic Server Administration Console を使用して、JDBC データ ソース、マルチ データ ソースなどの WebLogic Server の機能を有効化したり、コンフィグレーションやモニタを行ったりできます。また、JMX API と WebLogic Scripting Tool (WLST) を使用して、同じタスクをプログラム的に実行することもできます。コンフィグレーション後の JDBC 接続コンポーネントは、アプリケーション内で使用できます。

以下の節では、アプリケーションでの JDBC 接続の使用方法について説明します。

JDBC データ ソースおよびマルチ データ ソースのコンフィグレーションの詳細については、『Oracle Fusion Middleware Oracle WebLogic Server JDBC のコンフィグレーションと管理』を参照してください。

DataSource オブジェクトからのデータベース接続の取得

以下の節では、データ ソース、マルチ データ ソースのそれぞれについて、DataSource オブジェクトからデータベース接続を取得するように要求する方法を詳しく説明します。

DataSource オブジェクトにアクセスするパッケージのインポート

アプリケーションで DataSource オブジェクトを使用するには、以下のクラスをクライアント コードにインポートします。

import java.sql.*;
import java.util.*;
import javax.naming.*;

DataSource を使用したクライアント接続の取得

JDBC クライアント用に接続を取得するには、以下のコードに示すように、Java Naming and Directory Interface (JDNI) ルックアップを使用して 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();
   // これで conn オブジェクトを使用して
   // 文を作成し、結果セットを検索できる
    stmt = conn.createStatement();
    stmt.execute("select * from someTable");
    rs = stmt.getResultSet(); 
...
// できる限り速やかに JDBC オブジェクトを閉じる
    stmt.close();
    stmt=null;
    conn.close();
    conn=null;
 }
  catch (Exception e) {
    // エラー発生
    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 コンテキストを取得するためにいくつかの使用可能なプロシージャが使用されています。JNDI の詳細については、『Oracle Fusion Middleware Oracle 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 行のみが返されます。

ほとんどの場合、同じ結果をもたらすことができる標準の JDBC コードが存在します。この例では、set rowcount の代わりに setMaxRows() を使用できます。DBMS 固有の SQL コードの代わりに標準の JDBC コードを使用することをお勧めします。標準の JDBC 呼び出しを使用して接続を変更すると、接続がデータ ソースに返された時点で接続が標準の状態に戻ります。

接続を変更する DBMS 固有の SQL コードを使用する場合は、接続をデータ ソースに返す前に、その設定を受け入れ可能な状態に戻す必要があります。

アプリケーション スコープのデータ ソースからの接続の取得

アプリケーション スコープのデータ ソースから接続を取得するには、『Oracle Fusion Middleware Oracle WebLogic Server JDBC のコンフィグレーションと管理』の「パッケージ化 JDBC モジュールからのデータベース接続の取得」を参照してください。