新し いアプ リ ケーシ ョ ンでは、 DataSource オブジ ェ ク ト を使ってデータベース 接続を取得する こ と をお勧め し ます。 DataSource オブジ ェ ク ト を JNDI と 組み合 わせる と 、 データベースへの接続を提供する接続プールにア ク セス でき ます。
JDBC 1.x API を使用し た既存のアプ リ ケーシ ョ ン、 ま たはレ ガシー アプ リ ケー
シ ョ ンの場合は、 WebLogic 多層 ド ラ イバを使用し て、 データベース接続を取得 でき ます。以下の節では、 WebLogic Server で多層 JDBC ド ラ イバを使用する方法について 説明し ます。
4-1 ページの 「WebLogic RMI ド ラ イバの使い方」
4-7 ページの 「WebLogic JTS ド ラ イ バの使い方」
4-10 ページの 「WebLogic Pool ド ラ イバの使い方」
WebLogic RMI ド ラ イバの使い方
WebLogic RMI
ド ラ イ バは、 WebLogic Server が接続プールか らデータベース接 続を、 DataSource や TxDataSource に渡す と き に使用する多層 Type 3 JDBC ド ライバです。 DataSource オブジ ェ ク ト に よ り 、 WebLogic RMI ド ラ イ バを介し てア プ リ ケーシ ョ ンのデータベース接続にア ク セ スで き ます。Administration Console ま たは WebLogic 管理 API (DBMS へのア ク セスに使用する 2 層 JDBC ド ラ イ バ も含め ) を使用し て、 データベース接続パ ラ メ ータ を接続プールに設定し ます。
図 1-1を参照し て く だ さ い。
RMI
ド ラ イ バ ク ラ イ アン ト は、 DataSource オブジ ェ ク ト をル ッ ク ア ッ プする こ と で、 DBMS への接続を確立し ます。 こ のル ッ ク ア ッ プは、 Java Naming andDirectory Interface (JNDI)
ル ッ ク ア ッ プを使 う か、 ま たは ク ラ イ アン ト に代わっ て JNDI ル ッ ク ア ッ プを実行する WebLogic Server を直接呼び出すこ と に よ り 実 行 さ れます。RMI
ド ラ イ バは、 WebLogic t3 ド ラ イ バ ( こ の リ リ ースでは非推奨 ) と Pool ド ラ イバの機能に取っ て代わ る も ので、 独自の t3 プロ ト コルではな く Java 標準のRemote Method Invocation (RMI)
を使用し て WebLogic Server に接続し ます。RMI
実装の詳細は ド ラ イバに よ っ て自動的に処理 さ れる ため、 WebLogicJDBC/RMI
ド ラ イ バを使用する ために RMI の知識は必要ではあ り ません。WebLogic RMI ド ラ イバを使用するための WebLogic Server の設定
RMI
ド ラ イ バには、 DataSource オブジ ェ ク ト を通し てだけア ク セ スでき ます。DataSource
オブジ ェ ク ト は、 Administration Console で作成し ます。 アプ リ ケー シ ョ ンで RMI ド ラ イ バを使用するには、 まず WebLogic Server コ ン フ ィ グ レー シ ョ ンに DataSource オブジ ェ ク ト を作成し ます。 Administration Console を使用 し てマルチプールを作成する手順については、Administration Console オン ラ イ ン ヘルプを参照し て く だ さ い。 TxDataSource の作成手順については、Administration Console オン ラ イン ヘルプを参照し て く だ さ い。
RMI ド ラ イバを使用するサンプル ク ラ イアン ト コー ド
RMI
ド ラ イ バを使用し て、 WebLogic Server 接続プールか らデータベース接続を 取得し、 使用する方法を以下の コー ド サンプルで示し ます。WebLogic RMI
ド ラ イ バの使い方必要なパッ ケージを イ ンポー ト する
RMI
ド ラ イ バを使用し て、 データベース接続を取得 / 使用する前に、 次のパ ッ ケージを インポー ト し ます。javax.sql.DataSource java.sql.*
java.util.*
javax.naming.*
データ ベース接続を取得する
WebLogic JDBC/RMI
ク ラ イ アン ト は、 Administration Console で定義 さ れたDataSource
か ら DBMS への接続を取得し ます。 ク ラ イ アン ト は、 以下の 2 通 り の方法で DataSource オブジ ェ ク ト を取得で き ます。
JNDI
ル ッ ク ア ッ プを使用し ます。 こ れが最 も直接的で望ま し い方法です。Driver.connect() メ ソ ッ ド で DataSource 名を RMI ド ラ イ バに渡し ます。
こ の場合、 WebLogic Server は ク ラ イアン ト に代わって JNDI ル ッ ク ア ッ プ を実行し ます。
JNDI ルッ クア ッ プを使用し た接続の取得
JNDI
を使用し て WebLogic RMI ド ラ イ バにア ク セ スする には、 DataSource オブ ジ ェ ク ト の名前をル ッ ク ア ッ プする こ と で、 JNDI ツ リ ーか ら Context オブジ ェ ク ト を取得し ます。 た と えば、 Administration Console で定義 さ れた「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();
// これで conn オブジェクトを使用して // Statement オブジェクトを作成して // SQL 文を実行し、結果セットを処理できる
Statement stmt = conn.createStatement();
stmt.execute("select * from someTable");
ResultSet rs = stmt.getResultSet();
// 完了したら、文オブジェクトと
// 接続オブジェクトを忘れずにクローズすること stmt.close();
conn.close();
}
catch (NamingException e) { // エラー発生
}
finally {
try {ctx.close();}
catch (Exception e) { // エラー発生
} }
(
hostnameは WebLogic Server が稼働する マシンのホ ス ト 名、
portは WebLogic Server
が リ ク エス ト を リ ス ンする ポー ト の番号です。 )こ の例では、 Hashtable オブジ ェ ク ト を使って、 JNDI ル ッ ク ア ッ プに必要なパ ラ メ ータ を渡し ています。 JNDI ル ッ ク ア ッ プを実行する方法は他に も あ り ます。
詳細については、 『WebLogic JNDI プ ロ グ ラ マーズ ガ イ ド』 を参照し て く だ さ い。
ル ッ ク ア ッ プの失敗を捕捉する ために JNDI ル ッ ク ア ッ プが try/catchブ ロ ッ ク で包まれてい る点に注意し て く だ さ い。 ま た、 コ ンテキス ト が finallyブロ ッ
ク の中で ク ローズ さ れている 点に も注意し て く だ さ い
WebLogic RMI ド ラ イバだけを使用し て接続を取得する
DataSource
オブジ ェ ク ト をル ッ ク ア ッ プ し てデータベース接続を取得する代わり に、Driver.connect() メ ソ ッ ド を使用し て WebLogic Server にア ク セ スでき ます。 こ の場合は、 JDBC/RMI ド ラ イ バが JNDI ル ッ ク ア ッ プを実行し ます。
WebLogic Server
にア ク セ スするには、 WebLogic Server の URL と 、 DataSource オブジ ェ ク ト の名前を定義するパ ラ メ ータ を Driver.connect() メ ソ ッ ド に渡 し ます。 た と えば、 Administration Console で定義さ れた 「myDataSource」 と いう DataSource にア ク セ スするには、 以下の よ う に し ます。
WebLogic RMI
ド ラ イ バの使い方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は WebLogic Server が リ ク エス ト を リ ス ンする ポー ト の番号です。 )
ま た、 JNDI ユーザ情報を設定する ために使用する以下のプロパテ ィ も定義で き ます。
weblogic.user
- ユーザ名を指定し ます。
weblogic.credential
-
weblogic.userのパス ワー ド を指定し ます。WebLogic RMI ド ラ イバによる行キャ ッ シング
行キ ャ ッ シン グは、 アプ リ ケーシ ョ ンのパフ ォーマン ス を向上する ための
WebLogic Server JDBC
機能です。 通常、 ク ラ イアン ト が ResultSet.next()を 呼び出す と 、 WebLogic は DBMS か ら単一行を取得し、 こ れを ク ラ イ アン トJVM
に転送し ます。 行キ ャ ッ シ ングが有効にな っ てい る と 、ResultSet.next() を 1 回呼び出すだけで複数の DBMS 行が取得 さ れ、 こ れ ら が ク ラ イ アン ト メ モ リ にキ ャ ッ シ ュ さ れます。 行キ ャ ッ シン グ を行 う と 、 データ 取得のための通信の 回数が減る こ と でパフ ォーマン スが向上し ます。注意: ク ラ イ アン ト と WebLogic Server が同じ JVM にあ る場合、 行キ ャ ッ シン グは実行さ れません。
行キ ャ ッ シン グは、 データ ソ ース属性 [ 行のプ リ フ ェ ッ チを有効化 ] で有効に し た り 無効に し た り でき ます。 ま た、ResultSet.next()
の呼び出し ご と に取得 さ
れる行の数は、 データ ソ ース属性 [Row Prefetch サ イ ズ ] で設定し ます。 データソース属性は、 Administration Console で設定し ます。 行キ ャ ッ シング を有効に し て、 DataSource ま たは TxDataSource に行のプ リ フ ェ ッ チ サ イ ズ属性を設定す るには、 次の手順に従います。
1. Administration Console
の左ペインで、 [ サービ ス| JDBC |データ ソ ース|ト ラ ンザ ク シ ョ ン データ ソ ース ] を選択 し、 行キ ャ ッ シング を有効にする
DataSource
、 ま たは TxDataSource を選択し ます。2. Administration Console
の右ペインで、 [ コ ン フ ィ グ レーシ ョ ン ] タブを選択 ( まだ選択さ れていない場合 ) し ます。3. [
行のプ リ フ ェ ッ チを有効化 ] チェ ッ ク ボ ッ ク ス を選択し ます。4. [
行のプ リ フ ェ ッ チを有効化 ] で、ResultSet.next()の呼び出し ご と に キ ャ ッ シン グする行の数を指定し ます。WebLogic RMI ド ラ イバによる行キャ ッ シングの重要な制限 事項
RMI
ド ラ イバを使用し て行キ ャ ッ シング を実装する場合は、 以下の制限事項が あ る こ と に注意し て く だ さ い。行キ ャ ッ シングは、 結果セ ッ ト 型が TYPE_FORWARD_ONLY および
CONCUR_READ_ONLY
の両方であ る場合にのみ実行さ れます。結果セ ッ ト のデータ型に よ っ ては、 その結果セ ッ ト のキ ャ ッ シン グが無効で あ る場合があ り ます。 こ れには以下が含まれます。
LONGVARCHAR/LONGVARBINARY
NULL
BLOB/CLOB
ARRAY
REF
STRUCT
JAVA_OBJECT
行キ ャ ッ シングが有効で、 その結果セ ッ ト に対し てア ク テ ィ ブな場合、 一部 の ResultSet メ ソ ッ ド はサポー ト さ れません。 そのほ と んどは、 ス ト リ ー ミ ング データ、 ス ク ロール可能な結果セ ッ ト 、 ま たは行キ ャ ッ シ ングがサポー
ト さ れていないデータ型に関係し ています。 こ れには以下が含まれます。
getAsciiStream() getUnicodeStream()
WebLogic JTS
ド ラ イ バの使い方getBinaryStream() getCharacterStream() isBeforeLast() isAfterLast() isFirst() isLast() getRow()
getObject (Map) getRef()
getBlob()/getClob() getArray()
getDate() getTime() getTimestamp()
WebLogic JTS ド ラ イバの使い方
JTS (Java Transaction Services)
ド ラ イ バは、WebLogic Server 内で実行中のアプ リ ケーシ ョ ンか ら接続プールや SQL ト ラ ンザ ク シ ョ ンへのア ク セ ス を提供する、サーバ サ イ ド Java JDBC (Java Database Connectivity) ド ラ イ バです。 データベー スへの接続は接続プールか ら行われ、 アプ リ ケーシ ョ ンに代わっ てデータベース 管理シ ス テム (DBMS) に接続する ために WebLogic Server 内で実行 さ れる 2 層
JDBC
ド ラ イ バを使用し ます。ト ラ ンザ ク シ ョ ンが開始さ れる と 、 同じ接続プールか ら接続を取得する実行ス レ ッ ド のすべてのデータベース操作は、 そのプールの同 じ接続を共有する こ と に なっ てい ます。 こ れ ら の操作は、 エン タープ ラ イズ JavaBean (EJB) や Java
Messaging Service (JMS)
の よ う なサービ ス を通じ て、 ま たは標準 JDBC 呼び出し を使用し て直接 SQL を送信する こ と に よ り 行 う こ と がで き ます。 デフ ォル ト で は、 こ れ らすべての操作は同じ接続を共有し、 同じ ト ラ ンザ ク シ ョ ンに参加し ま す。 ト ラ ンザ ク シ ョ ンがコ ミ ッ ト ま たは ロールバ ッ ク さ れる と 、 接続はプールに 戻さ れます。Java
ク ラ イ アン ト は JTS ド ラ イ バ自身を登録し ない場合 も あ り ますが、 RemoteMethod Invocation (RMI)
を介し て ト ラ ンザ ク シ ョ ンに参加する こ と がで き ます。あ る ク ラ イ ア ン ト の 1 つのス レ ッ ド 内で ト ラ ンザ ク シ ョ ンを開始し、 その ク ラ イ ア ン ト に リ モー ト RMI オブジ ェ ク ト を呼び出 さ せる こ と ができ ます。 リ モー ト オブジ ェ ク ト に よ って実行さ れ るデータベース操作は、 その ク ラ イアン ト 上で開 始 さ れた ト ラ ンザ ク シ ョ ンの一部分にな り ます。 その リ モー ト オブジ ェ ク ト が それを呼び出し た ク ラ イ アン ト に戻 さ れた ら、 その ト ラ ンザ ク シ ョ ンを コ ミ ッ ト ま たはロールバ ッ ク でき ます。 リ モー ト オブジ ェ ク ト に よ って実行さ れるデー タベース操作は、 すべて同一の接続プールを使用し なければな らず、 同一の ト ラ ンザ ク シ ョ ンの一部にな ら なければな り ません。
JTS ド ラ イバを使用するサンプル ク ラ イアン ト コー ド
JTS
ド ラ イ バを使用する には、まず Administration Console を使用し て WebLogicServer
に接続プールを作成し なければな り ません。 詳細については、2-2 ページの 「接続プールの コ ン フ ィ グ レーシ ョ ン と 使い方」 を参照し て く だ さ い。
次に、 サーバサ イド アプ リ ケーシ ョ ンか ら JTS ト ラ ンザ ク シ ョ ン を作成し て使 用する方法について説明し ます。 こ こ では、 「myConnectionPool」 と い う 接続 プールを使用し ます。
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();