Oracle® Fusion Middleware Oracle WebLogic Server JDBCのプログラミング 11g リリース1 (10.3.5) B60995-03 |
|
前 |
次 |
新しいアプリケーションでは、DataSourceオブジェクトを使ってデータベース接続を取得することをお勧めします。DataSourceオブジェクト(WebLogicデータ・ソースおよびマルチ・データ・ソース)をJNDIツリーと一緒に使用して、データ・ソース内のプールされた接続にアクセスしてデータベース接続を取得できます。WebLogicラッパー・ドライバは非推奨になっています。JDBC 1.x APIを使用した既存のアプリケーションまたはレガシー・アプリケーションの場合は、WebLogicラッパー・ドライバを使用してデータベース接続を取得できます。
次の節では、WebLogic ServerでのWebLogicラッパー・ドライバの使い方を説明します。
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ドライバには、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データ・ソースの構成と管理』のトランザクション・オプションに関する項を参照してください。
トランザクションが開始されると、同じデータ・ソースから接続を取得する実行スレッドのすべてのデータベース操作で、そのデータ・ソースの同じ接続が共有されます。これらの操作は、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の開発」のデータベースのアクセスを参照してください。