ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JDBCのプログラミング
11gリリース1 (10.3.6)
B60995-04
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

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

この章では、非推奨のWebLogicラッパー・ドライバとWebLogic Serverを組み合せて使用する方法について説明します。


注意:

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

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


注意:

RMIドライバ・クライアント機能は非推奨で、将来のリリースで削除される予定です。このリリースで導入されたWLConnectionおよびWLDataSourceの機能はRMIドライバ・クライアントでサポートされません。『Oracle WebLogic Server JDBCのプログラミング』のこのリリースの新規および変更されたJDBCデータ・ソース機能に関する項を参照してください。

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の知識は必要ではありません。

RMIドライバ・クライアントの相互運用性

以前のリリースのWebLogic Serverとの相互運用性には制限があります。参加(クライアント/サーバーまたはサーバー・ツー・サーバー)できるのは、同じメジャー・リリースのもののみです。以前の10.xクライアントは、ucp.jarCLASSPATHに追加することで、以降のリリースやパッチ・セットと相互運用するよう更新できます。

WebLogic RMIドライバのセキュリティ上の考慮事項

WebLogic Server 10.3.2.0以前、RMIドライバ・クライアントではDataSourceオブジェクトへの非認可のRMIアクセスが可能でした。クライアントで、制御されていないデータベースへのアクセスが可能になるため、セキュリティの脆弱性が潜在することになります。これらの環境では、RMIドライバ・クライアントをWebLogicデータ・ソースおよびマルチ・データ・ソースと置き換えるか、RMIドライバ・クライアントが使用される場合は強力なネットワーク・セキュリティを実装することをお薦めします。

WebLogic Server 10.3.2.0以上のドメインのサーバーの場合、DataSourceオブジェクトへのRMIアクセスは、weblogic.jdbc.remoteEnabledシステム・プロパティによってサーバー・レベルで制御されます。デフォルトでは無効です。RMIドライバ・クライアントでDataSourceオブジェクトにアクセスできるようにするには、weblogic.jdbc.remoteEnabledプロパティの値をtrueに設定します。RMIドライバ・クライアントをWebLogicデータ・ソースおよびマルチ・データ・ソースと置き換えるか、RMIドライバ・クライアントが使用される場合は強力なネットワーク・セキュリティを実装することをお薦めします。


注意:

weblogic.jdbc.remoteEnabledシステム・プロパティは、WebLogic Server 10.3.6.0では推奨されません。

WebLogic Server 10.3.6.0以上のドメインのサーバーの場合、「RMI JDBCセキュリティ」パラメータを「セキュア」に設定することで、RMIドライバ・クライアントとDataSourceオブジェクトとの通信をサーバー・レベルで保護できます。

有効な値は次のとおりです。

  • セキュア: リモート・クライアントおよびサーバーによるRMIを介した受信JDBC呼出しはすべて無効です。すべての受信JDBC呼出しではJTSが使用され、管理者認証されます。匿名などのその他のサブジェクトはすべて拒否されます。このオプションには、次のいずれかが必要です。

    • ドメイン内通信の場合: 構成済SSLリスニング・ポート。

    • ドメイン間通信の場合: 参加するドメイン間の構成済クロスドメイン・セキュリティ。『Oracle WebLogic Serverの保護』のWebLogic Serverドメイン間のクロス・ドメイン・セキュリティの有効化に関する項を参照してください。

    セキュリティが構成されていない場合、すべての操作が例外で失敗します。

  • 互換性: RMIを使用してデータ・ソースにアクセスする場合、アプリケーションのサブジェクトとのセキュアでないチャネルが使用され、管理者認証は使用されません。この設定は、データ・ソースへのRMIアクセスに関するレガシー実装の動作を反映しており、クライアントで、制御されていないデータベースへのアクセスが可能になるため、セキュリティの脆弱性が潜在することになります。この設定は、強固なネットワーク・セキュリティが設置されているときにのみ使用します。「互換性」がデフォルト値です。

Oracle WebLogic Server管理コンソール・ヘルプRMI JDBCセキュリティの有効化に関する項を参照してください。


注意:

weblogic.jdbc.remoteEnabledシステム・プロパティがtrueに設定されている場合、「RMI JDBCセキュリティ」はオーバーライドされ、既存のアプリケーションとの下位互換が保たれます。

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

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

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

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

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

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

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

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

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

  • JNDIルックアップを使用します。これが最も直接的で望ましい方法です。

  • Driver.connect()メソッドでDataSource名をRMIドライバに渡します。この場合、WebLogic Serverはクライアントに代わってJNDIルックアップを実行します。

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

JNDIを使用してWebLogic RMIドライバにアクセスするには、DataSourceオブジェクトの名前をルックアップすることで、JNDIツリーからContextオブジェクトを取得します。たとえば、管理コンソールで定義された「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();
   // You can now use the conn object to create 
   //  a Statement object to execute
   //  SQL statements and process result sets:
   Statement stmt = conn.createStatement();
   stmt.execute("select * from someTable");
   ResultSet rs = stmt.getResultSet(); 
   // Do not forget to close the statement and connection objects
   //  when you are finished:
 }
  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; }
}

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

この例では、ハッシュ表オブジェクトを使用して、JNDIルックアップに必要なパラメータを渡しています。JNDIルックアップを実行するには他の方法もあります。詳細は、『Oracle WebLogic Server JNDIのプログラミング』を参照してください。

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

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

DataSourceオブジェクトをルックアップしてデータベース接続を取得する代わりに、Driver.connect()メソッドを使用してWebLogic Serverにアクセスできます。この場合は、JDBC/RMIドライバによってJNDIルックアップが実行されます。WebLogic Serverにアクセスするには、WebLogic ServerのURLとDataSourceオブジェクトの名前を定義するパラメータをDriver.connect()メソッドに渡します。たとえば、管理コンソールで定義された「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.user - ユーザー名を指定します。

  • weblogic.credential - weblogic.userのパスワードを指定します。

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

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


注意:

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

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

  1. まだ行っていない場合、管理コンソールのチェンジ・センターで「ロックして編集」をクリックします。

  2. 「ドメイン構造」ツリーで「サービス」>「JDBC」を展開し、「データ・ソース」を選択します。

  3. 「データ・ソースの概要」ページでデータ・ソース名をクリックします。

  4. 「構成」>「全般」タブを選択してから、以下の作業を行います。

    1. 「行のプリフェッチを有効化」チェック・ボックスを選択します。

    2. 「プリフェッチする行のサイズ」に、ResultSet.next()の呼出しごとにキャッシュする行の数を入力します。

  5. 「保存」をクリックします。

  6. 管理コンソールのチェンジ・センターで「変更のアクティブ化」をクリックしてこれらの変更をアクティブ化します。

Oracle WebLogic Server管理コンソール・ヘルプ「JDBCデータ・ソース>構成>一般」ページを参照してください。

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

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

  • 行キャッシングは、結果セット型がTYPE_FORWARD_ONLYおよびCONCUR_READ_ONLYの両方である場合にのみ実行されます。

  • 結果セットのデータ型によっては、その結果セットのキャッシングが無効である場合があります。これには以下が含まれます。

    • LONGVARCHAR/LONGVARBINARY

    • NULL

    • BLOB/CLOB

    • ARRAY

    • REF

    • STRUCT

    • JAVA_OBJECT

  • 行キャッシングが有効で、その結果セットに対してアクティブな場合、一部のResultSetメソッドはサポートされません。そのほとんどは、ストリーミング・データ、スクロール可能な結果セット、または行キャッシングがサポートされていないデータ型に関係しています。これには以下が含まれます。

    • getAsciiStream()

    • getUnicodeStream()

    • getBinaryStream()

    • getCharacterStream()

    • isBeforeLast()

    • isAfterLast()

    • isFirst()

    • isLast()

    • getRow()

    • getObject (Map)

    • getRef()

    • getBlob()/getClob()

    • getArray()

    • getDate()

    • getTime()

    • getTimestamp()

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

グローバル・トランザクション内における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フェーズ・コミット・トランザクションに参加できるようになります。『Oracle WebLogic Server JDBCデータ・ソースの構成と管理』のJDBCデータ・ソース・トランザクション・オプションに関する項を参照してください。


注意:

ロギング・ラスト・リソース(LLR)、1フェーズ・コミットまたは2フェーズ・コミットのエミュレートを使用する接続に参加する場合、WebLogic Server JTSドライバではT3プロトコルのみサポートされます。

トランザクションが開始されると、同じデータ・ソースから接続を取得する実行スレッドのすべてのデータベース操作で、そのデータ・ソースの同じ接続が共有されます。これらの操作は、Enterprise 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ドライバを使用するには、まず管理コンソールを使用してWebLogic Serverにデータ・ソースを作成する必要があります。

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

  1. 以下のクラスをインポートします。

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

    Context ctx = null;
    Hashtable env = new Hashtable();
     
    env.put(Context.INITIAL_CONTEXT_FACTORY,
             "weblogic.jndi.WLInitialContextFactory");
     
    // Parameters for the WebLogic Server. 
    // Substitute the correct hostname, port number 
    // user name, and password for your environment:
    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");
    
  3. 現在のスレッドのトランザクションを開始します。

    // Start the global transaction before getting a connection
    tx.begin();
    
  4. JTSドライバをロードします。

    Driver myDriver = (Driver)
     Class.forName("weblogic.jdbc.jts.Driver").newInstance();
    
  5. データ・ソースから接続を取得します。

    Properties props = new Properties();
    props.put("connectionPoolID", "myDataSource");
    
    conn = myDriver.connect("jdbc:weblogic:jts", props); 
    
  6. データベース操作を実行します。これらの操作は、EJB、JMS、および標準JDBC文など、データベース接続を使用するどのサービスでも実行できます。これらの操作では、必ずJTSドライバを使用して、手順3で開始したトランザクションと同じデータ・ソースにアクセスすることによって、このトランザクションに参加するようにします。

    JTSドライバを使用する追加のデータベース操作で、手順5で指定したデータ・ソースとは違うデータ・ソースを使用すると、そのトランザクションをコミットまたはロールバックしようとしたときに例外が発生します。

  7. 接続オブジェクトを閉じます。接続を閉じても、それでトランザクションがコミットされるわけでも、その接続がプールに戻されるわけでもないことに注意してください。

    conn.close();
    
  8. そのトランザクションをコミットまたはロールバックすることにより、トランザクションを完了します。JTSドライバは、現在のスレッドに存在するすべての接続オブジェクトのすべてのトランザクションをコミットし、接続をプールに返します。

    tx.commit();
     
    // or:
     
    tx.rollback();
    

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

WebLogicプール・ドライバを使用すると、HTTPサーブレットまたはEJBなどのサーバー側アプリケーションからデータ・ソースを利用できます。プール・ドライバの使用方法の詳細は、『Oracle WebLogic Server Webアプリケーション、サーブレットおよびJSPの開発』のデータベースのアクセスに関する項を参照してください。