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

3 JDBC アプ リ ケーシ ョ ンのパ フ ォーマンス チューニング

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

以下の節では、 JDBC アプ リ ケーシ ョ ンを最大限に活用する方法について説明し ます。

3-1 ページの 「JDBC パフ ォーマン スの概要」

3-1 ページの 「WebLogic のパフ ォーマン ス向上機能」

3-3 ページの 「ベス ト パフ ォーマン スのためのアプ リ ケーシ ョ ン設計」

JDBC パフ ォーマンスの概要

Java、 JDBC、 および DBMS 処理に関連する概念は、 多 く のプロ グ ラ マに と って

未知の も のです。 Java が さ ら に普及し ていけば、 データベース ア ク セ ス と デー

タベース アプ リ ケーシ ョ ンの実装はよ り 簡単にな り ます。 こ の ド キ ュ メ ン ト で は、 JDBC アプ リ ケーシ ョ ンか ら最高のパフ ォーマン ス を引き出すための ヒ ン ト を紹介し ます。

WebLogic のパフ ォーマンス向上機能

WebLogic には、 JDBC アプ リ ケーシ ョ ンのパフ ォーマン ス を向上 させる ための

機能がい く つか用意 さ れています。

接続プールによるパフ ォーマンスの向上

DBMS

への JDBC 接続を確立する には非常に時間がかか る場合があ り ます。

JDBC

アプ リ ケーシ ョ ンでデータベース接続のオープン と ク ローズ を繰 り 返す必

要があ る場合、 こ れは重大なパフ ォーマン スの問題 と な り ます。 WebLogic 接続 プールは、 こ う し た問題を効率的に解決し ます。

WebLogic Server

を起動する と 、 接続プール内の接続が開き、 すべての ク ラ イア

ン ト が使用で き る よ う にな り ます。 ク ラ イアン ト が接続プールの接続を ク ローズ する と 、 その接続はプールに戻さ れ、 他の ク ラ イアン ト が使用でき る状態にな り ます。 つま り 、 接続その ものは ク ローズ さ れません。 プール接続のオープン と ク ローズには、 ほ と んど負荷がかか り ません。

どの く ら いの数の接続をプールに作成すればよ いで し ょ う か。 接続プールの数 は、 コ ン フ ィ グ レーシ ョ ン さ れたパラ メ ータに従っ て最大数 と 最小数の間で増減

さ せる こ と ができ ます。 常に最高のパフ ォーマン スが得 られる のは、 同時ユーザ と 同じ く ら いの数の接続が接続プールに存在する場合です。

Prepared Statement と データのキャ ッ シング

DBMS のア ク セ スでは大量に リ ソース を消費し ます。 プロ グ ラ ムで Prepared

Statement

を再利用する場合、 ま たは複数のアプ リ ケーシ ョ ンでの共有や、 各接

続ど う し での存続が可能な頻繁に使用するデータにア ク セ スする場合は、 以下の も のを使用し てデータ を キ ャ ッ シ ュ でき ます。

接続プールの Prepared Statement キ ャ ッ シ ュ

読み込み専用のエンテ ィ テ ィ Bean

ク ラ ス タ環境での JNDI

ベス ト パ フ ォ ー マ ン スのためのア プ リ ケーシ ョ ン設計

ベス ト パフ ォーマンスのためのアプ リ ケー シ ョ ン設計

データベース アプ リ ケーシ ョ ンのパフ ォーマン スの良し悪し はほ と んどの場合、

アプ リ ケーシ ョ ン言語ではな く 、 アプ リ ケーシ ョ ンがどの よ う に設計 さ れている かに よ っ て決定ま り ます。 ク ラ イアン ト の数 と 場所、 DBMS テーブルおよびイ ンデ ッ ク スのサ イズ と 構造、 およびク エ リ の数 と タ イ プは、 すべてアプ リ ケー シ ョ ンのパフ ォーマン スに影響を与え ます。

以下では、 すべての DBMS に当てはま る一般的な ヒ ン ト を示し ます。 ま た、 ア プ リ ケーシ ョ ンで使用する 特定の DBMS の ド キ ュ メ ン ト に よ く 目を通し てお く こ と も重要です。

1. データ をでき るだけデータ ベースの内部で処理 する

DBMS

アプ リ ケーシ ョ ンのパフ ォーマン スに関する最も深刻な問題は、 生デー

タ を不必要に移動する こ と か ら発生し ます。 こ れは、 生データ をネ ッ ト ワー ク上 で移動する場合に も、 単に DBMS のキ ャ ッ シ ュ に出し入れする場合に も言え る こ と です。 こ う し た無駄を最小限に抑え る ための良い方法は、 ク ラ イ アン ト が

DBMS

と 同じ マシンで動作 し てい る場合で も、 ロ ジ ッ ク を ク ラ イアン ト ではな く データの格納場所、 つま り DBMS に置 く こ と です。 実際の と こ ろ、 一部の

DBMS

では、1 個の CPU を共有する フ ァ ッ ト ク ラ イ アン ト と フ ァ ッ ト DBMS は パフ ォーマン スの致命的な低下を も た ら し ます。

大部分の DBMS は、 ス ト ア ド プロ シージ ャ と い う 、 データの格納場所に ロ ジ ッ ク を置 く ための理想的なツールを備えています。 ス ト ア ド プ ロ シージ ャ を呼び 出し て 10 個の行を更新する ク ラ イア ン ト と 、 同 じ行を取得および変更し、

UPDATE

文を送信し てその変更を DBMS に保存する ク ラ イアン ト の間には、 パ

フ ォーマン スに大き な違いがあ り ます。

ま た、 DBMS の ド キ ュ メ ン ト を参照し て、 DBMS 内のキ ャ ッ シ ュ メ モ リ の管理 について調べる必要も あ り ます。 一部の DBMS (Sybase など ) は、 DBMS に割 り 当て られた仮想 メ モ リ を分割し、 特定のオブジ ェ ク ト がキ ャ ッ シ ュ の固定領域を 独占的に使用でき る よ う にする機能を備えています。 こ の機能を使用する と 、 重 要なテーブルま たはインデ ッ ク ス をデ ィ ス ク か ら一度読み出し てお く こ と で、

デ ィ ス ク に再度ア ク セ ス し な く て もすべての ク ラ イ アン ト がそれ ら を使用でき る よ う にな り ます。

2. 組み込み DBMS セ ッ ト ベース処理を使用する

SQL

は、 セ ッ ト 処理言語です。 DBMS は、 完全にセ ッ ト ベース処理を行 う よ う に設計 さ れています。 データベースへの 1 行へのア ク セスは、 例外な く セ ッ ト ベースの処理よ り 遅 く 、 ま た DBMS に よ っ ては実装が不完全です。 た と えば、

従業員 100 名に関するデータ が格納さ れてい る 4 つのテーブルがあ る場合、 全従 業員について各テーブルを一度に更新する方が、従業員 1 名ご と に各テーブルを

100 回更新する よ り 常に高速です。

あ ま り に複雑すぎて 1 行ずつ処理する以外に方法がない と 考え ら れていた処理の 多 く が、 セ ッ ト ベースの処理に書き換え ら れ、 パフ ォーマン スの向上を実現し て います。 た と えば、 あ る有名な給与管理アプ リ ケーシ ョ ンは、 巨大で低速な

COBOL アプ リ ケーシ ョ ンか ら、 連続実行 さ れる 4 つのス ト ア ド プ ロ シージ ャ に

変換さ れま し た。 こ の結果、 マルチ CPU マシンで何時間も かかった処理が、 よ

り 少ない リ ソ ースで 15 分で実行で き る よ う にな り ま し た。

3. ク エ リ を効率化する

ユーザか ら よ く 尋ねられ る質問に、 「特定の結果セ ッ ト で返さ れ る行数はどの く ら いか」 と い う も のがあ り ます。 すべての行を取 り 出さ ずに調べる唯一の方法 は、 次の よ う に count キーワー ド を使用し て同じ ク エ リ を発行する こ と です。

SELECT count(*) from myTable, yourTable where ...

こ れに よ り 、 関連するデータには変更がなかった場合に、 オ リ ジナルの ク エ リ が 戻すべき行数が返 さ れます。 ま た関連するデータに影響を与え る その他の

DBMS ア ク テ ィ ビテ ィ が起き た場合に、 ク エ リ を実行すれば、 実際の行数は変

わ り ます。

ベス ト パ フ ォ ー マ ン スのためのア プ リ ケーシ ョ ン設計 ただ し 、 こ れは リ ソ ース を大量に消費する処理であ る こ と に注意し て く だ さ い。

元の ク エ リ に よ っては、 DBMS は行を送信するの と 同じ く ら いの処理を行っ て 行を カ ウ ン ト する必要があ り ます。

アプ リ ケーシ ョ ンの ク エ リ は、 実際にどの よ う なデータが必要なのかをでき る限 り 具体的に指定する必要があ り ます。 た と えば、 まず一時テーブルに抽出し 、 カ ウ ン ト だけを返し、 次に限定さ れた 2 番目の ク エ リ を送信し て一時テーブル内の 行のサブセ ッ ト だけを返すよ う に し ます。

ク ラ イ アン ト が本当に必要なデータだけを抽出する こ と が、 きわめて重要です。

ISAM (

リ レーシ ョ ナル データベース以前のアーキテ ク チャ ) か ら移植 さ れた一

部のアプ リ ケーシ ョ ンでは、 実際に必要なのは最初の数行だけであ っ て も、 テー ブル内のすべての行を選択する ク エ リ が送信さ れます。 ま た、 最初に取得する行 を得る ために 「sort by」 句を使用する アプ リ ケーシ ョ ン も あ り ます。 こ の よ う な データベース ク エ リ は、 パフ ォーマン ス を不必要に低下 させます。

SQL を適切に使用する と 、 こ う し たパフ ォーマン ス上の問題を回避で き ます。

た と えば、 高額給与の社員の う ち上位 3 人だけのデータが必要な場合、 ク エ リ を 適切に行 う には、 相関サブ ク エ リ を使用し ます。 表 3-1に SQL 文が返す全体の 表を示し ます。

select * from payroll 表3-1 返された完全な結果

名前 給与

Joe 10

Mikes 20

Sam 30

Tom 40

Jan 50

Ann 60

Sue 70

Hal 80

相関サブ ク エ リ

select p.name, p.salary from payroll p where 3 >= (select count(*) from payroll pp where pp.salary >= p.salary);

表 3-2に示すよ う に、 こ の ク エ リ では、 よ り 小さ い結果が返 さ れます。

こ の ク エ リ では、 上位 3 名の高所得者の名前 と 給与が登録さ れた 3 行だけが返 さ れます。 こ の ク エ リ では、 給与テーブル全体を ス キ ャ ン し、 次に各行について内 部ループで給与テーブル全体を再ス キ ャ ン し て、 ループの外でス キ ャ ン し た現在 の行よ り 高額の給与が何件あ る かを調べます。 こ の処理は複雑な よ う に見え る か も し れませんが、 DBMS はこ の種の処理では SQL を効率的に使用する よ う に設 計 さ れています。

4. ト ラ ンザク シ ョ ンを単一バッ チにする

可能な限 り 、 一連のデータ処理を収集し、 更新 ト ラ ンザ ク シ ョ ン を次の よ う な単 一の文で発行し て く だ さ い。

BEGIN TRANSACTION

May 80

3-2 サブ ク エ リの結果

名前 給与

Sue 70

Hal 80

May 80

3-1 返された完全な結果

名前 給与

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