• 検索結果がありません。

4 WebLogic 多層 JDBC ド ラ イバの 使い方

ドキュメント内 jdbc.book (ページ 73-83)

新し いアプ リ ケーシ ョ ンでは、 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 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 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 ド ラ イ バ自身を登録し ない場合 も あ り ますが、 Remote

Method Invocation (RMI)

を介し て ト ラ ンザ ク シ ョ ンに参加する こ と がで き ます。

あ る ク ラ イ ア ン ト の 1 つのス レ ッ ド 内で ト ラ ンザ ク シ ョ ンを開始し、 その ク ラ イ ア ン ト に リ モー ト RMI オブジ ェ ク ト を呼び出 さ せる こ と ができ ます。 リ モー ト オブジ ェ ク ト に よ って実行さ れ るデータベース操作は、 その ク ラ イアン ト 上で開 始 さ れた ト ラ ンザ ク シ ョ ンの一部分にな り ます。 その リ モー ト オブジ ェ ク ト が それを呼び出し た ク ラ イ アン ト に戻 さ れた ら、 その ト ラ ンザ ク シ ョ ンを コ ミ ッ ト ま たはロールバ ッ ク でき ます。 リ モー ト オブジ ェ ク ト に よ って実行さ れるデー タベース操作は、 すべて同一の接続プールを使用し なければな らず、 同一の ト ラ ンザ ク シ ョ ンの一部にな ら なければな り ません。

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

JTS

ド ラ イ バを使用する には、まず Administration Console を使用し て WebLogic

Server

に接続プールを作成し なければな り ません。 詳細については、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();

ドキュメント内 jdbc.book (ページ 73-83)