プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle WebLogic Server JDBCアプリケーションの開発
12c (12.2.1.3.0)
E90331-01
目次へ移動
目次

前
次

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

非推奨のWebLogicラッパー・ドライバをWebLogic Serverで使用する方法について説明します。

注意:

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

この章には次の項が含まれます:

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

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

注意:

RMIドライバ・クライアント機能は非推奨で、将来のリリースでは削除されます。WLConnectionおよびWLDataSourceで公開される機能は、RMIドライバ・クライアントによってサポートされません。

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プロパティの値をfalseに設定します。RMIドライバ・クライアントをWebLogicデータ・ソースと置き換えること、RMIドライバ・クライアントが使用される場合には強力なネットワーク・セキュリティ手段を実装することをお薦めします。

WebLogic Server 10.3.6.0以上のドメインのサーバーでは、RMI JDBC SecurityパラメータをSecureに設定して、RMIドライバ・クライアントのDataSourceオブジェクトとの通信をサーバー・レベルで保護できます。

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

  • Secure: リモート・クライアントおよびリモート・サーバーがRMI上で行うすべての着信JDBC呼出しが無効です。JTSを使用するすべての着信JDBC呼出しには管理者認証があります。匿名を含め他のすべてのサブジェクトは拒否されます。このオプションでは次のいずれかが必要です。

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

    • ドメイン間通信の場合: 参加ドメイン間の構成済クロスドメイン・セキュリティ。Oracle WebLogic Serverセキュリティの管理のWebLogic Server間のクロスドメイン・セキュリティの有効化を参照してください。

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

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

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

注意:

weblogic.jdbc.remoteEnabledシステム・プロパティがfalseに設定されている場合、RMI JDBC Securityをオーバーライドし、既存のアプリケーションとの後方互換性を提供します。

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

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

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

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

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

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

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

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

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

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

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

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

JNDIを使用してWebLogic RMIドライバにアクセスするには、DataSourceオブジェクトの名前をルックアップすることで、JNDIツリーからContextオブジェクトを取得します。たとえば、WebLogic Server管理コンソールで定義された「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ブロックの中で閉じられている点に留意します。

注意:

ベンダー固有のインタフェースにアクセスできる可能性があります。これはベンダー・インタフェースにキャストすることで、RMIなしで実行されます。例:

OracleConnection oc = (OracleConnection) cconn;

これは、ベンダー・インタフェースがSerializableでない場合には正常に動作しない可能性があります。サーバーがクライアントとして動作している場合、生成されたRMIクラスが使用できるように、サーバーでnetworkClassLoadingEnabledtrueに設定します(スタンドアロン・クライアントのデフォルトはtrueです)。

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

DataSourceオブジェクトをルックアップしてデータベース接続を取得する代わりに、Driver.connect()メソッドを使用してWebLogic Serverにアクセスできます。この場合は、JDBC/RMIドライバによってJNDIルックアップが実行されます。WebLogic Serverにアクセスするには、WebLogic ServerのURLとDataSourceオブジェクトの名前を定義するパラメータをDriver.connect()メソッドに渡します。たとえば、WebLogic Server管理コンソールで定義された「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()の呼出しごとに取得される行の数は、データ・ソース属性の「プリフェッチする行のサイズ」で設定します。データ・ソースの属性は、WebLogic Server管理コンソールで設定します。行キャッシングを有効にして、データ・ソースに「プリフェッチする行のサイズ」属性を設定するには、次の手順に従います:

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

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

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

  4. 「構成: 一般」タブを選択してから、次を実行します:

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

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

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

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

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の取得は、Fetch Out Of Sequency例外によって失敗することがあります。例:

  1. RMI呼出しが返ると、グローバル・トランザクションはサーバー・インスタンスによって自動的に中断されます。

  2. JDBCドライバは、保留中のResultSetオブジェクトを無効化して、システム・リソースを解放します。

  3. クライアントは、無効化されたResultSetからデータを読み出そうとします。

  4. データがプリフェッチされていなかった場合、Fetch Out Of Sequency例外がスローされます。プリフェッチされる行数はベンダーによって異なるため、特に1行または2行での作業を行っているのであれば、この問題が生じる場合と生じない場合があります。

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

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

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

アプリケーションでは、データ・ソースから取得した接続へのアクセスにJTSドライバが使用されます。

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

注意:

ロギング・ラスト・リソース(LLR)を使用する接続に参加するとき、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管理コンソールを使用して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();