5 WebLogicラッパー・ドライバの使い方
ノート:
新しいアプリケーションでは、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.jarをCLASSPATHに追加することで、新しいポイント・リリースやパッチ・セット・リリースと相互運用するように更新できます。
WebLogic RMIドライバのセキュリティ考慮事項
JDBC over RMIを使用するアプリケーションでは、認可されていないRMIがDataSourceオブジェクトにアクセスすることが可能で、クライアントがデータベースへのアクセスを制御できないため、セキュリティが脆弱になる可能性があります。このような環境では、JDBC over RMIをローカルのWebLogicデータ・ソースに置き換えることをお薦めします。
JDBC over RMIの通信を制御するには、DataSourceオブジェクトのRmiJDBCSecurityパラメータをサーバー・レベルで設定します。
Oracle WebLogic Server管理コンソール・オンライン・ヘルプのRMI JDBCセキュリティの有効化を参照してください。
パラメータの有効な値は次のとおりです:
-
Compatibility- RMI経由でJDBCアプリケーションに着信するすべての呼出しに対して、DataSourceオブジェクトへの制御されていないアクセスを許可します。この設定は、強固なネットワーク・セキュリティが設置されているときにのみ使用します。Compatibilityがデフォルト値です。 -
Secure- RMI経由で、リモート・クライアントやサーバーからJDBCアプリケーションに着信するすべての呼出しを拒否します。RMI経由での内部サーバー間のJDBC呼出し操作は、「ロギング・ラスト・リソース」、「2フェーズ・コミットのエミュレート」および「1フェーズ・コミット」グローバル・トランザクション・プロトコル・オプションで使用できます。Secureオプションでは、すべてのサーバーがSSLリスニング・ポートで構成されている必要があります。そうでない場合、すべての操作が例外で失敗します。
ノート:
weblogic.jdbc.remoteEnabled (非推奨)システム・プロパティはデフォルトで有効になっています。weblogic.jdbc.remoteEnabledシステム・プロパティをfalseに設定すると、DataSourceオブジェクトへのRMIアクセスを完全に無効化できます。
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アプリケーションの開発』のWebLogic Server JNDIに関する項を参照してください。
ルックアップの失敗を捕捉するためにJNDIルックアップがtry/catchブロックで包まれている点、コンテキストがfinallyブロックの中で閉じられている点に留意します。
ノート:
ベンダー固有のインタフェースにアクセスできる可能性があります。これはベンダー・インタフェースにキャストすることで、RMIなしで実行されます。たとえば:
OracleConnection oc = (OracleConnection) cconn;
これは、ベンダー・インタフェースがSerializableでない場合には正常に動作しない可能性があります。サーバーがクライアントとして動作している場合、生成されたRMIクラスが使用できるように、サーバーでnetworkClassLoadingEnabledをtrueに設定します(スタンドアロン・クライアントのデフォルトは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管理コンソールで設定します。行キャッシングを有効にして、データ・ソースに「プリフェッチする行のサイズ」属性を設定するには、次のステップに従います:
-
まだ実行していない場合は、WebLogic Server管理コンソールのチェンジ・センターで「ロックして編集」をクリックします。
-
「ドメイン構造」ツリーで「サービス」>「JDBC」を展開し、「データ・ソース」を選択します。
-
「データ・ソースの概要」ページでデータ・ソース名をクリックします。
-
「構成: 一般」タブを選択してから、次を実行します:
-
「行のプリフェッチを有効化」チェック・ボックスを選択します。
-
「プリフェッチする行のサイズ」に、
ResultSet.next()の呼出しごとにキャッシュする行の数を入力します。
-
-
「保存」をクリックします。
-
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例外によって失敗することがあります。たとえば:
-
RMI呼出しが返ると、グローバル・トランザクションはサーバー・インスタンスによって自動的に中断されます。
-
JDBCドライバは、保留中の
ResultSetオブジェクトを無効化して、システム・リソースを解放します。 -
クライアントは、無効化された
ResultSetからデータを読み出そうとします。 -
データがプリフェッチされていなかった場合、
Fetch Out Of Sequency例外がスローされます。プリフェッチされる行数はベンダーによって異なるため、特に1行または2行での作業を行っているのであれば、この問題が生じる場合と生じない場合があります。
この例外が発生した場合は、必ずRowSetをサーバー側で取得し、その後それをクライアントにシリアライズして戻すようにします。
WebLogic JTSドライバの使い方(非推奨)
アプリケーションでは、データ・ソースから取得した接続へのアクセスに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);を呼び出す必要があります。