以前、コンテナー管理パーシスタンス (CMP) Bean メソッド ejbStore の WebSphere Application Server の
インプリメンテーションは、パーシスタント属性フィールドのサブセットのみが変更された場合でも、
常に CMP Bean のすべてのパーシスタント属性をデータベースに保管していました。
この不必要な性能低下は、このリリースの製品では除去されています。
Enterprise JavaBeans (EJB) 2.x CMP エンティティー Bean の場合、
部分更新 機能を使用して、データベースに対する CMP Bean のパーシスタント属性を更新する方法を指定することができます。
この機能は、
Bean 用に構成されたアクセス・インテント・ポリシーで、
PartialOperation と呼ばれる Bean レベルの
パーシスタンス・オプションとして提供されています。PartialOperation には、可能な値が 2 つあります。
- NONE
- 部分更新はオフにされています。
CMP Bean のすべてのパーシスタント属性はデータベースに保管されます。
これはデフォルト値です。
- UPDATE_ONLY
- データベースへの更新は、変更されている CMP Bean のパーシスタント属性だけに行うことを指定します。
部分更新の設定方法について詳しくは、
コンテナー管理パーシスタント Bean の部分更新の設定
を参照してください。
パフォーマンスへの影響
部分更新を実行すると、いくつかの点でパフォーマンスが向上します。
- 照会内に列のサブセットのみがあるため、照会の実行時間が短縮されます。
列および索引が多いテーブルの方が、大きく改善されます。
テーブルに多数の索引がある場合、更新済みの列によって影響を受ける索引のみが、
バックエンド・データベースによって更新される必要があります。
- 送信されるデータが少なくなるため、ネットワーク I/O が削減されます。
- 入力レコードを部分的に挿入することにより、非自明的にマップされる列の処理時間が節約されます (列が
コンバーター/コンポーザー/変換を使用する場合)。
- 不必要な更新トリガーの起動は除去されます。CMP Bean フィールドが変更されない場合、
対応する列にのみ依存するトリガーは起動しません。
部分更新により、全般的にパフォーマンスは向上しますが、
パフォーマンスに悪影響を及ぼす可能性もあります。
- ご使用のアプリケーションでいくつかの異なる列の組み合わせが同じタイム・スパン中に変更される Bean に対して、
部分更新を使用可能にする場合、その接続用の準備済みステートメント・キャッシュの最大値に急速に達します。
結果として、ステートメント・ハンドルは、最低使用頻度に基づいて、キャッシュから除去されます。
この結果、ステートメントは何度も繰り返し準備され、CMP の全機能に対して
パフォーマンスが低下します (ejbStore() のみに限定されません)。
- 機能セットにキャッシュされた部分更新照会テンプレートは、メモリーの使用を増やします。
この増加は、
部分更新アクセス・インテント・オプションがオンになっている CMP Bean のフィールド数と比較して、線形です。
- PartialOperation パーシスタント・オプションは、
バッチ更新パーシスタント・オプションとともに使用した場合、バッチ更新のパフォーマンスに影響を及ぼします。
これは現在、それぞれの部分照会が異なるためです。部分更新照会ストリングを動的に生成するために
実行時間コストが発生します。照会フラグメントは各列に対して保管されるため、
ダーティーの CMP Bean フィールドの数に基づいて、照会フラグメントをアセンブルするための実行コストは線形です。
- 各 CMP フィールドについて、状態確認があります (例えば、ダーティー・フラグの検査、
preparedStatement setXXX() 呼び出しの実行など)。
部分更新の使用に関する考慮事項
ユーザーが達成したいパフォーマンスの向上は、低下が発生する可能性のあるインスタンスに対して評価する
必要があります。次のガイドラインを使用して、判断に役立てることができます。
- 単純なデータ型を持ち、更新トリガーを持たない小さなテーブル (少数列) のみを含むアプリケーションでは、
部分更新による利益が得られない可能性があります。
部分照会を動的にアセンブルするためのコストが、パフォーマンス向上を上回る可能性があります。
- 頻繁に更新されない複素数データ型がある場合、部分更新は有益です。
複素数データ型の例は、
BLOB OR VARGRAPHIC にマップされた「写真」CMP 属性、または
データベース・マネージャー・インプリメンテーションの別のロケーションに通常保管される、
類似した複素数バックエンド・タイプを持つ Employee Bean である可能性があります。
- いくつかの VARCHAR タイプ列があり、その中のわずかなものだけが通常更新される場合、
部分更新が有益となる可能性があります。
- アプリケーションが異なる列の組み合わせをランダムに更新することが可能で、
割り当て可能な列 (非キー) が 5 より高い場合は、部分操作を使用しないことをお勧めします。
これにより、多数の異なる部分照会が生成され、
準備済みステートメント・キャッシュが急速にいっぱいになります。ただし、Bean が多数の列を持たないで (4 以下)、
複素数データ型を持つ場合、
照会数が増えてもよいように、ステートメント・キャッシュ・サイズを大きくするというオプション付きで、
部分更新をオンにすることを考慮する場合があります。ステートメント・キャッシュ・サイズの増大について詳しくは、
データ・ソース設定
を参照してください。
- 列のサブセットで必要な更新トリガーがある場合、部分更新は有益です。
- テーブルに多数の列および索引があり、わずかな索引のみが通常の更新の影響を受ける場合、
部分更新は有益です。
制約事項
デフォルトでは、部分更新が使用可能になっているすべての CMP Bean に対して、更新照会 のバッチ更新は
使用不可になっています。つまり、部分更新は、バッチ更新よりも優先されます。
削除および挿入照会のバッチ更新は、影響を受けません。
バッチ更新および部分更新パーシスタンス・オプションが同じ Bean で使用される場合、
各部分照会が異なるため、バッチ更新のパフォーマンスは影響を受けます。
JVM プロパティー -Dcom.ibm.ws.pm.grouppartialupdate=true を使用して、
類似した部分更新照会をバッチ更新にグループ化することができます。部分更新のグループ化は、
1 つのトランザクションに同型の部分照会がいくつかある場合にのみ役立ちます。
そうでない場合は、部分更新のグループ化はパフォーマンスに悪影響を及ぼします。
この設定は Bean レベルを基本としていないため、
オンにする場合は注意する必要があります。これは、部分更新とバッチ更新の両方がオンになっている Bean に影響を及ぼすため、
部分照会のバッチ更新が、両方の更新がオンになっているすべての Bean 間で表示される場合に、
パフォーマンスが実際に向上することを確認する必要があります。
そのため、アプリケーションに対して、
バッチ更新または部分更新のみ、あるいはその両方 (grouppartialupdate フラグを true に設定) のうち、
最高のパフォーマンスをもたらす状態を判断する必要があります。
JVM プロパティーを設定するには、次のようにします。
1. server.xml ファイルを開きます。
2. -Dcom.ibm.ws.pm.grouppartialupdate=true の値を
-Dcom.ibm.ws.pm.grouppartialupdate=false に変更します。