EJB 2.x コンテナー管理パーシスタンス (CMP) エンティティー Bean の場合、CMP Bean
のパーシスタント属性をデータベースに更新する方法を指定するパーシスタンス・オプションとして、部分操作を使用します。
部分操作では 次の 2 つの値を選択することができます: NONE または UPDATE_ONLY。
部分操作のデフォルト設定は NONE です。パーシスタント属性フィールドの 1 つのサブセットのみが変更されても、データベースへの CMP Bean のパーシスタント属性が、すべてそのデータベースに保管されます。
部分操作の UPDATE_ONLY オプションは、データベースへの更新を、修正された CMP Bean のパーシスタント属性のみに制限します。Bean の setter メソッドは、対応する CMP 属性の修正が行われたかどうかを判別します。この修正は、変更されている実際の値に基づくものではありません。すなわち、setter メソッドが呼び出され、古い値と新しい値が同じである場合、CMP 属性はダーティーであると考えられます。
Bean 用に構成済みのアクセス・インテント・ポリシーの Bean
レベルで、部分操作をパーシスタント・オプションとして指定することができます。 部分操作を指定する方法の詳細については、
エンティティー Bean
2.x への Bean レベル・アクセス・インテントの追加を参照してください。
機能の利点
部分更新 (部分操作に UPDATE_ONLY 値を選択する)
オプションは、次の機能上の利点を得られるように設計されています。
- すべての列が常時更新される場合、CMP Bean にマップされているテーブルのどの更新トリガーも、常時実行されます。これにより、データベースは不整合な状態になる可能性があります。
また、特定の列が更新される回数、または特定の列が更新される回数によって異なるどのトリガー論理も、正常に機能し更新を完了することができません。
部分更新を使用すれば、これらの制限を克服し、CMP Bean
での更新トリガーを使用可能にすることができます。
- 部分更新では、オプティミスティック並行性の述部としてのヌル可能列の使用がサポートされます。
パフォーマンスの利点
部分更新オプションは、次のパフォーマンス上の利点が得られるように設計されています。
- クエリーにある列のサブセットは 1 つだけのため、クエリー実行時間を削減します。
多数の列および索引があるテーブルの場合は、さらにパフォーマンスを向上させることができます。
例えば、テーブルに多数の索引がある場合、
バックエンド・データベースによって更新される必要があるのは、更新された列によって影響される索引のみとなります。
- 送信されるデータがより少ないため、ネットワーク I/O を削減します。
- 高価なコンバーター、コンポーザー、または他の複合変換を持つ未変更 CMP フィールドの処理時間を節減します。
すなわち、コンバーター、コンポーザー、または、その他の複合変換へマップするなどの、
バックエンド・データベースへの重要なマップが実行される CMP フィールドでは、その CMP
フィールドが未変更であるときに、この処理の実行時間が節減されます。
- 更新トリガーの不要な実行を行いません。例えば、CMP フィールドが未変更である場合、対応する列によって異なるどのトリガーも実行されません。
パフォーマンスへの悪影響
部分更新は、パフォーマンスの向上を図るために設計されたものですが、パフォーマンスに悪影響を与えることもあります。
部分更新の使用を検討する場合、次の要因も考慮してください。
制約事項
- 部分更新を使用している場合、バッチ更新の実行ができない場合があります。部分更新が使用可能な場合、更新クエリーのバッチ更新は、デフォルトですべての CMP Bean で使用不可です。すなわち、
部分更新は、バッチ更新に優先します。
ただし、削除クエリーおよび挿入クエリーの場合のバッチ更新の動作は、部分更新により影響を受けず、未変更のままです。
バッチ更新に対する部分更新の優先をオーバーライドするには、次の手順に従ってください。
- server.xml ファイルを開きます。
- -Dcom.ibm.ws.pm.grouppartialupdate プロパティーの値を
true に変更します。このプロパティーが、true に設定され、部分更新が選択されているとき、更新クエリーのバッチ更新は、類似する部分クエリーをグループ化します。
- 部分更新は、SQLJ または CMP/A に対してサポートされません。