WebLogic JDBC プログラマーズ ガイド

     前  次    新しいウィンドウで目次を開く     
ここから内容の開始

WebLogic ラッパー ドライバの使い方

新しいアプリケーションでは、DataSource オブジェクトを使ってデータベース接続を取得することをお勧めします。DataSource オブジェクト (WebLogic データ ソースおよびマルチ データ ソース) を JNDI ツリーと一緒に使用して、データ ソース内のプールされた接続にアクセスしてデータベース接続を取得できます。WebLogic ラッパー ドライバは非推奨になっています。JDBC 1.x API を使用した既存のアプリケーションまたはレガシー アプリケーションの場合は、WebLogic ラッパー ドライバを使用してデータベース接続を取得できます。

次の節では、WebLogic Server での WebLogic ラッパー ドライバの使い方を説明します。

 


WebLogic RMI ドライバの使い方 (非推奨)

RMI ドライバ クライアントは、DataSource オブジェクトをルックアップすることで、DBMS への接続を確立します。このルックアップは、Java Naming and Directory Interface (JNDI) ルックアップを使うか、またはクライアントに代わって JNDI ルックアップを実行する WebLogic Server を直接呼び出すことにより実行されます。

RMI ドライバは、WebLogic t3 ドライバ (このリリースでは非推奨) と Pool ドライバの機能に取って代わるもので、独自の t3 プロトコルではなく Java 標準の Remote Method Invocation (RMI) を使用して WebLogic Server に接続します。

RMI 実装の詳細はドライバによって自動的に処理されるため、WebLogic JDBC/RMI ドライバを使用するために RMI の知識は必要ではありません。

WebLogic RMI ドライバを使用するための WebLogic Server の設定

RMI ドライバには、DataSource オブジェクトを通してだけアクセスできます。DataSource オブジェクトは、Administration Console で作成します。アプリケーションで RMI ドライバを使用するには、まず WebLogic Server コンフィグレーションに DataSource オブジェクトを作成します。

RMI ドライバを使用するサンプル クライアント コード

RMI ドライバを使用して、WebLogic Server データ ソースからデータベース接続を取得し、使用する方法を以下のサンプル コードに示します。

必要なパッケージをインポートする

RMI ドライバを使用して、データベース接続を取得/使用する前に、次のパッケージをインポートします。

   javax.sql.DataSource 
   java.sql.*
   java.util.*
   javax.naming.*

データベース接続を取得する

WebLogic JDBC/RMI クライアントは、Administration Console で定義された DataSource から DBMS への接続を取得します。クライアントは、以下の 2 通りの方法で DataSource オブジェクトを取得できます。

JNDI ルックアップを使用して接続を取得する

JNDI を使用して WebLogic RMI ドライバにアクセスするには、DataSource オブジェクトの名前をルックアップすることで、JNDI ツリーから Context オブジェクトを取得します。たとえば、Administration Console で定義された「myDataSource」という DataSource にアクセスするには、以下のようにします。

Context ctx = null;
Hashtable ht = new Hashtable();
ht.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
ht.put(Context.PROVIDER_URL,
"t3://hostname:port");
  try {
ctx = new InitialContext(ht);
javax.sql.DataSource ds
= (javax.sql.DataSource) ctx.lookup ("myDataSource");
java.sql.Connection conn = ds.getConnection();
   // これで conn オブジェクトを使用して
   //  Statement オブジェクトを作成して
   //  SQL 文を実行し、結果セットを処理できる
   Statement stmt = conn.createStatement();
   stmt.execute("select * from someTable");
   ResultSet rs = stmt.getResultSet();
   // 完了したら、文オブジェクトと
   //  接続オブジェクトを忘れずに閉じること
 }
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; }
}

(hostname は WebLogic Server が稼働するマシンの名前、port はそのマシンにおいて接続リクエストをリスンするポートの番号です)。

この例では、Hashtable オブジェクトを使って、JNDI ルックアップに必要なパラメータを渡しています。JNDI ルックアップを実行する方法は他にもあります。詳細については、『WebLogic JNDI プログラマーズ ガイド』を参照してください。

ルックアップの失敗を捕捉するために JNDI ルックアップが try/catch ブロックで包まれている点、コンテキストが finally ブロックの中で閉じられている点に留意します。

WebLogic RMI ドライバだけを使用してデータベース接続を取得する

DataSource オブジェクトをルックアップしてデータベース接続を取得する代わりに、Driver.connect() メソッドを使用して WebLogic Server にアクセスできます。この場合は、JDBC/RMI ドライバによって JNDI ルックアップが実行されます。WebLogic Server にアクセスするには、WebLogic Server の URL と DataSource オブジェクトの名前を定義するパラメータを Driver.connect() メソッドに渡します。たとえば、Administration Console で定義された「myDataSource」という DataSource にアクセスするには、以下のようにします。

java.sql.Driver myDriver = (java.sql.Driver)
  Class.forName("weblogic.jdbc.rmi.Driver").newInstance();
String url =	"jdbc:weblogic:rmi";
java.util.Properties props = new java.util.Properties();
props.put("weblogic.server.url", "t3://hostname:port");
props.put("weblogic.jdbc.datasource", "myDataSource");
java.sql.Connection conn = myDriver.connect(url, props);

(hostname は WebLogic Server が稼働するマシンの名前、port はそのマシンにおいて接続リクエストをリスンするポートの番号です)。

また、JNDI ユーザ情報を設定するために使用する以下のプロパティも定義できます。

WebLogic RMI ドライバによる行キャッシング

行キャッシングは、アプリケーションのパフォーマンスを向上させるための WebLogic Server JDBC 機能です。通常、クライアントで ResultSet.next() を呼び出すと、WebLogic Server では DBMS から単一行を取得し、これをクライアント JVM に転送します。行キャッシングが有効になっていると、ResultSet.next() を 1 回呼び出すだけで複数の DBMS 行が取得され、これらがクライアント メモリにキャッシュされます。行キャッシングを行うと、データ取得のための通信の回数が減ることでパフォーマンスが向上します。

注意 : クライアントと WebLogic Server が同じ JVM にある場合、行キャッシングは実行されません。

行キャッシングは、データ ソースの [行のプリフェッチを有効化] 属性で有効にしたり無効にしたりできます。また、ResultSet.next() の呼び出しごとに取得される行の数は、データ ソース属性 [プリフェッチする行サイズ] で設定します。データ ソースの属性は、Administration Console で設定します。行キャッシングを有効にして、データ ソースに行のプリフェッチ サイズの属性を設定するには、次の手順に従います。

  1. まだ行っていない場合、Administration Console のチェンジ センタで [ロックして編集] をクリックします。
  2. [ドメイン構造] ツリーで [サービス|JDBC] を展開し、[データ ソース] を選択します。
  3. [JDBC データ ソースの概要] ページでデータ ソース名をクリックします。
  4. [コンフィグレーション|全般] タブを選択してから、以下の作業を行います。
    1. [行のプリフェッチを有効化] チェック ボックスを選択します。
    2. [プリフェッチする行のサイズ] に、ResultSet.next() の呼び出しごとにキャッシュする行の数を入力します。
  5. [保存] をクリックします。
  6. Administration Console のチェンジ センタで [変更のアクティブ化] をクリックしてこれらの変更をアクティブ化します。

Administration Console オンライン ヘルプの「JDBC データ ソース : コンフィグレーション : 全般」を参照してください。

WebLogic RMI ドライバによる行キャッシングの重要な制限事項

RMI ドライバを使用して行キャッシングを実装する場合は、以下の制限事項があることに注意してください。

グローバル トランザクション使用時の制限事項

グローバル トランザクション内における RowSet の取得は、「フェッチ順序無効」例外によって失敗することがあります。次に例を示します。

  1. RMI 呼び出しが返ると、グローバル トランザクションはサーバ インスタンスによって自動的に中断されます。
  2. JDBC ドライバは、保留中の ResultSet オブジェクトを無効化して、システム リソースを解放します。
  3. クライアントは、無効化された ResultSet からデータを読み出そうとします。
  4. データがプリフェッチされていなかった場合、「フェッチ順序無効」例外が送出されます。プリフェッチされる行数はベンダによって異なるため、特に 1 行または 2 行での作業を行っているのであれば、この問題が生じる場合と生じない場合があります。

この例外が発生した場合は、必ず RowSet をサーバサイドで取得し、その後それをクライアントにシリアライズして戻すようにします。

 


WebLogic JTS ドライバの使い方 (非推奨)

JTS (Java Transaction Services) ドライバは、WebLogic Server 内で実行中のアプリケーションからデータ ソースやグローバル トランザクションへのアクセスを提供する、サーバサイド Java JDBC (Java Database Connectivity) ドライバです。データベースへの接続はデータ ソースから行われ、アプリケーションに代わってデータベース管理システム (DBMS) に接続するために WebLogic Server 内の JDBC ドライバが使用されます。アプリケーションでは、データ ソースから取得した接続へのアクセスに JTS ドライバが使用されます。

WebLogic Server ではまた、XA 非対応の JDBC ドライバを使用するデータ ソースからの接続がグローバル トランザクションに参加する際に、JTS ドライバが内部的に使用されます ([ロギング ラスト リソース] および [2 フェーズ コミットのエミュレート])。この動作により、XA 非対応のリソースが XA をエミュレートし、2 フェーズ コミット トランザクションに参加できるようになります。『WebLogic JDBC のコンフィグレーションと管理』の「トランザクション オプション」を参照してください。

トランザクションが開始されると、同じデータ ソースから接続を取得する実行スレッドのすべてのデータベース操作で、そのデータ ソースの同じ接続が共有されます。これらの操作は、エンタープライズ JavaBean (EJB) や Java Messaging Service (JMS) のようなサービスを通じて、または標準 JDBC 呼び出しを使用して直接 SQL を送信することにより行うことができます。デフォルトでは、これらすべての操作は同じ接続を共有し、同じトランザクションに参加します。トランザクションがコミットまたはロールバックされると、接続はプールに戻されます。

Java クライアントは JTS ドライバ自身を登録しない場合もありますが、Remote Method Invocation (RMI) を介してトランザクションに参加することができます。あるクライアントの 1 つのスレッド内でトランザクションを開始し、そのクライアントにリモート RMI オブジェクトを呼び出させることができます。リモート オブジェクトによって実行されるデータベース操作は、そのクライアント上で開始されたトランザクションの一部分になります。そのリモート オブジェクトがそれを呼び出したクライアントに戻されたら、そのトランザクションをコミットまたはロールバックできます。リモート オブジェクトによって実行されるデータベース操作は、すべて必ず同一のデータ ソースを使用して、同一のトランザクションの一部になる必要があります。

JTS ドライバおよびアプリケーションがグローバル トランザクションに参加するためには、アプリケーションはグローバル トランザクション内で conn = myDriver.connect("jdbc:weblogic:jts", props); を呼び出す必要があります。トランザクションが完了する (コミットまたはロールバックされる) と、接続はデータ ソースに返されます。別のグローバル トランザクションで接続を使用する場合、アプリケーションは新しいグローバル トランザクション内で再度 conn = myDriver.connect("jdbc:weblogic:jts", props); を呼び出す必要があります。

JTS ドライバを使用するサンプル クライアント コード

JTS ドライバを使用するには、まず Administration Console を使用して WebLogic Server にデータ ソースを作成する必要があります。

次に、サーバサイド アプリケーションから JTS トランザクションを作成して使用する方法について説明します。ここでは、「myDataSource」というデータ ソースを使用します。

  1. 以下のクラスをインポートします。
  2. import javax.transaction.UserTransaction;
    import java.sql.*;
    import javax.naming.*;
    import java.util.*;
    import weblogic.jndi.*;
  3. UserTransaction クラスを使用してトランザクションを確立します。JNDI ツリー上でこのクラスをルックアップできます。UserTransaction クラスは、現在の実行スレッド上のトランザクションを制御します。このクラスはトランザクション自身を表さないことに注意してください。このトランザクションの実際のコンテキストは、現在の実行スレッドに関連付けられています。
  4. Context ctx = null;
    Hashtable env = new Hashtable();

    env.put(Context.INITIAL_CONTEXT_FACTORY,
    "weblogic.jndi.WLInitialContextFactory");

    // WebLogic Server のパラメータ
    // 環境に合わせて適切なホスト名、ポート番号、
    // ユーザ名、およびパスワードに置き換える
    env.put(Context.PROVIDER_URL, "t3://localhost:7001");
    env.put(Context.SECURITY_PRINCIPAL, "Fred");
    env.put(Context.SECURITY_CREDENTIALS, "secret");

    ctx = new InitialContext(env);

    UserTransaction tx = (UserTransaction)
    ctx.lookup("javax.transaction.UserTransaction");
  5. 現在のスレッドのトランザクションを開始します。
  6. // 接続を取得する前にグローバル トランザクションを開始する
    tx.begin();
  7. JTS ドライバをロードします。
  8. Driver myDriver = (Driver)
    Class.forName("weblogic.jdbc.jts.Driver").newInstance();
  9. データ ソースから接続を取得します。
  10. Properties props = new Properties();
    props.put("connectionPoolID", "myDataSource");

    conn = myDriver.connect("jdbc:weblogic:jts", props);
  11. データベース操作を実行します。これらの操作は、EJB、JMS、および標準 JDBC 文など、データベース接続を使用するどのサービスでも実行できます。これらの操作では、必ず JTS ドライバを使用して、手順 3 で開始したトランザクションと同じデータ ソースにアクセスすることによって、このトランザクションに参加するようにします。
  12. JTS ドライバを使用する追加のデータベース操作で、手順 5 で指定したデータ ソースとは違うデータ ソースを使用すると、そのトランザクションをコミットまたはロールバックしようとしたときに例外が発生します。

  13. 接続オブジェクトを閉じます。接続を閉じても、それでトランザクションがコミットされるわけでも、その接続がプールに戻されるわけでもないことに注意してください。
  14. conn.close();
  15. そのトランザクションをコミットまたはロールバックすることにより、トランザクションを完了します。JTS ドライバは、現在のスレッドに存在するすべての接続オブジェクトのすべてのトランザクションをコミットし、接続をプールに返します。
  16. tx.commit();

    // または

    tx.rollback();

 


WebLogic Pool ドライバの使い方 (非推奨)

WebLogic Pool ドライバを使用すると、HTTP サーブレットや EJB などのサーバサイド アプリケーションからデータ ソースを利用できます。Pool ドライバの使い方については、『WebLogic Server Web アプリケーション、サーブレット、JSP の開発』の「サーブレット プログラミング タスク」を参照してください。


ページの先頭       前  次