Oracle® Fusion Middleware Oracle WebLogic Server 10.3.6 JDBCのプログラミング 11gリリース1 (10.3.6) B60995-08 |
|
![]() 前 |
![]() 次 |
この章では、非推奨のWebLogicラッパー・ドライバをWebLogic Server 10.3.6で使用する方法について説明します。
注意: 新しいアプリケーションでは、DataSourceオブジェクトを使ってデータベース接続を取得することをお薦めします。DataSourceオブジェクト(WebLogicデータ・ソースおよびマルチ・データ・ソース)をJNDIツリーと一緒に使用して、データ・ソース内のプールされた接続にアクセスしてデータベース接続を取得できます。WebLogicラッパー・ドライバは非推奨になっています。JDBC 1.x APIを使用した既存のアプリケーションまたはレガシー・アプリケーションの場合は、WebLogicラッパー・ドライバを使用してデータベース接続を取得できます。 |
この章には次の項が含まれます:
注意: RMIドライバ・クライアント機能は非推奨で、将来のリリースでは削除されます。このリリースのWLConnection とWLDataSource に導入された機能は、RMIドライバ・クライアントではサポートされません。『Oracle WebLogic Server JDBCのプログラミング』の該当リリースでの新規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の知識は必要ではありません。
以前のWebLogic Serverリリースとの相互運用性は限られています。参加者(クライアントとサーバーまたはサーバーとサーバー)は、同じメジャー・リリースである必要があります。初期の10.xクライアントは、ucp.jar
をCLASSPATH
に追加することで、新しいポイント・リリースやパッチ・セット・リリースと相互運用するように更新できます。
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.jdbc.remoteEnabled システム・プロパティはWebLogic Server 10.3.6.0では非推奨です。 |
WebLogic Server 10.3.6.0以上のドメインのサーバーでは、RMI JDBC Security
パラメータをSecure
に設定して、RMIドライバ・クライアントのDataSourceオブジェクトとの通信をサーバー・レベルで保護できます。
有効な値は次のとおりです。
Secure: リモート・クライアントおよびリモート・サーバーがRMI上で行うすべての着信JDBC呼出しが無効です。すべての着信JDBC呼出しはJTSを使用し、管理者認証があります。匿名を含め他のすべてのサブジェクトは拒否されます。このオプションでは次のいずれかが必要です。
ドメイン内通信の場合: 構成済SSLリスニング・ポート。
ドメイン間通信の場合: 参加ドメイン間の構成済クロスドメイン・セキュリティ。『Oracle WebLogic Serverの保護』のWebLogic Server間のクロスドメイン・セキュリティの有効化に関する項を参照してください。
セキュリティが構成されていない場合、すべての操作は例外が発生して失敗します。
Compatibility: アプリケーションのサブジェクトに対して安全でないチャネルを使用ます。また、RMIを使用してデータ・ソースにアクセスするとき管理者認証がありません。この設定は、RMIがデータ・ソースにアクセスする従来の実装の動作を反映しています。クライアントによるデータベースへのアクセスが管理されない場合があるため、セキュリティが潜在的に脆弱になります。この設定は、強固なネットワーク・セキュリティが設置されているときにのみ使用します。Compatibility
がデフォルト値です。
Oracle WebLogic Server管理コンソール・ヘルプのRMI JDBCセキュリティの有効化に関する項を参照してください。
注意: weblogic.jdbc.remoteEnabled システム・プロパティがtrueに設定されている場合、RMI JDBC Security をオーバーライドし、既存のアプリケーションとの後方互換性を提供します。 |
RMIドライバには、DataSourceオブジェクトを通してだけアクセスできます。DataSourceオブジェクトは、管理コンソールで作成します。アプリケーションでRMIドライバを使用するには、まずWebLogic Server構成にDataSourceオブジェクトを作成します。
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を使用して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
ブロックの中で閉じられている点に留意します。
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 Server JDBC機能です。通常、クライアントでResultSet.next()
を呼び出すと、WebLogic ServerではDBMSから単一行を取得し、これをクライアントJVMに転送します。行キャッシングが有効になっていると、ResultSet.next()
を1回呼び出すだけで複数のDBMS行が取得され、これらがクライアント・メモリーにキャッシュされます。行キャッシングを行うと、データ取得のための通信の回数が減ることでパフォーマンスが向上します。
注意: クライアントとWebLogic Serverが同じJVMにある場合、行キャッシングは実行されません。 |
行キャッシングは、データ・ソース属性の「行のプリフェッチを有効化」で有効または無効にできます。また、ResultSet.next()
の呼出しごとに取得される行の数は、データ・ソース属性の「プリフェッチする行のサイズ」で設定します。データ・ソースの属性は、管理コンソールで設定します。行キャッシングを有効にして、データ・ソースに「プリフェッチする行のサイズ」属性を設定するには、次の手順に従います:
まだそうしていない場合、管理コンソールのチェンジ・センターで「ロックして編集」をクリックします。
「ドメイン構造」ツリーで「サービス」>「JDBC」を展開し、「データ・ソース」を選択します。
「データ・ソースの概要」ページでデータ・ソース名をクリックします。
「構成: 一般」タブを選択してから、次を実行します:
「行のプリフェッチを有効化」チェック・ボックスを選択します。
「プリフェッチする行のサイズ」に、ResultSet.next()
の呼出しごとにキャッシュする行の数を入力します。
「保存」をクリックします。
管理コンソールのチェンジ・センターで「変更のアクティブ化」をクリックしてこれらの変更をアクティブ化します。
Oracle WebLogic Server管理コンソール・ヘルプの「JDBCデータ・ソース: 構成: 一般」ページを参照してください。
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の取得は、「フェッチ順序無効」例外によって失敗することがあります。例:
RMI呼出しが返ると、グローバル・トランザクションはサーバー・インスタンスによって自動的に中断されます。
JDBCドライバは、保留中のResultSetオブジェクトを無効化して、システム・リソースを解放します。
クライアントは、無効化されたResultSetからデータを読み出そうとします。
データがプリフェッチされていなかった場合、「フェッチ順序無効」例外がスローされます。プリフェッチされる行数はベンダーによって異なるため、特に1行または2行での作業を行っているのであれば、この問題が生じる場合と生じない場合があります。
この例外が発生した場合は、必ずRowSetをサーバー側で取得し、その後それをクライアントにシリアライズして戻すようにします。
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ドライバを使用するには、まず管理コンソールを使用してWebLogic Serverにデータ・ソースを作成する必要があります。
次に、サーバー側アプリケーションからJTSトランザクションを作成して使用する方法について説明します。ここでは、「myDataSource」
というデータ・ソースを使用します。
以下のクラスをインポートします。
import javax.transaction.UserTransaction; import java.sql.*; import javax.naming.*; import java.util.*; import weblogic.jndi.*;
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");
現在のスレッドのトランザクションを開始します。
// Start the global transaction before getting a connection tx.begin();
JTSドライバをロードします。
Driver myDriver = (Driver) Class.forName("weblogic.jdbc.jts.Driver").newInstance();
データ・ソースから接続を取得します。
Properties props = new Properties(); props.put("connectionPoolID", "myDataSource"); conn = myDriver.connect("jdbc:weblogic:jts", props);
データベース操作を実行します。これらの操作は、EJB、JMS、および標準JDBC文など、データベース接続を使用するどのサービスでも実行できます。これらの操作では、必ずJTSドライバを使用して、手順3で開始したトランザクションと同じデータ・ソースにアクセスすることによって、このトランザクションに参加するようにします。
JTSドライバを使用する追加のデータベース操作で、手順5で指定したデータ・ソースと異なるデータ・ソースを使用すると、そのトランザクションをコミットまたはロールバックしようとしたときに例外が発生します。
接続オブジェクトを閉じます。接続を閉じても、それでトランザクションがコミットされるわけでも、その接続がプールに戻されるわけでもないことに注意してください。
conn.close();
そのトランザクションをコミットまたはロールバックすることにより、トランザクションを完了します。JTSドライバは、現在のスレッドに存在するすべての接続オブジェクトのすべてのトランザクションをコミットし、接続をプールに返します。
tx.commit(); // or: tx.rollback();
WebLogicプール・ドライバを使用すると、HTTPサーブレットまたはEJBなどのサーバー側アプリケーションからデータ・ソースを利用できます。プール・ドライバの使用方法の詳細は、『Oracle WebLogic Server Webアプリケーション、サーブレット、JSPの開発』のデータベースのアクセスを参照してください。