EJB 照会のデータベース制限
Enterprise JavaBeans (EJB) 照会機能は、データベースに対する一定の制限に従う必要があります。
一般データベース制限
- 特定の照会に関連するエンタープライズ Bean はすべて、同じデータ・ソースにマップする必要がありま す。 EJB 照会は、クロス・データ・ソース結合操作をサポートしません。
- ejbSelect EJB 照会言語の照会用に、WebSphere® Application Server のデプロイメント・コード生成ユーティリティーによって生成された構造化照会言語 (SQL) ステートメントは、すべての列がヌル値の結果セットで構成された行を返す可能性があります。
実行時に、この照会の結果として受け取ったセットをパーシスタンス・マネージャーが保存します。 アプリケーションで結果 Bean の 1 次キーが取得された場合、パーシスタンス・マネージャーはエクストラクターを呼び出します。エクストラクターとは、生成されたクラスを EJB がデプロイするメソッドのことです。 このメソッドは、ヌル列の項目については値 0 を返します。 この値は EJB コンテナーに戻され、アプリケーションに転送されます。 EJB コンテナーは、PK 値 0 を使用して Bean インスタンスを起動します。 この場合、エンド・ユーザーはこの Bean インスタンスがヌルの PK と PK 値 0 のどちらを持つか判断できないため、問題が発生することがあります。
これを回避するには、finder 照会で IS NOT NULL 節を使用して、結果セットにヌル値が含まれないようにします。
特定のデータベース制限
異なるデータベース製品は、EJB 照会ステートメントに組み込むことができるエレメントに異なる制限をもうけます。 以下は、これらの制限のリストです。ご使用の環境に適用するかどうかをデータベース管理者と確認してください。
- 他のデータベースによってサポートされていないため、特定の関数は DB2® のみに対して稼働する照会で使用されます。特定のコンテナー管理パーシスタンス (CMP) フィールドをマップするために使用される場合、このような関数としては、日時演算式、特定のスカラー関数 (ベンダー間で移植可能としてリストされていないものを含む)、および暗黙のスカラー関数があります。例えば、int 数値型を 10 進数 (5,2) 型フィールドにマップするとします。DB2 以外のデータベースに対してデプロイされると、この特定のマッピングと CMP フィールドを含む finder または select 照会は、「照会のプッシュダウンができません」というエラー・メッセージが表示されて失敗します。
- ストリング型の CMP は、データベースで文字ラージ・オブジェクト (CLOB) にマップされると、データベースでは CLOB 比較がサポートされていないため、比較演算に使用できません。
- データベースは、比較演算子とともにリテラルまたは入力パラメータ ーとして使用されるストリング値の長さに制限を設けることがあります。 これらの制限は照会パフォーマンスに悪影響を与えることがあります。 例えば、z/OS® プラットフォーム上の DB2 では、実行時の ?1 の値の長さが 255 より大きいと、検索「name = ?1」が失敗することがあります。
- 数値 CMP 型を異なる型を含む列にマッピングすると、予期しない結果が発生することがあります。 例えば、int 数値型を 10 進型 (5,2) の列にマッピングする場合を考えてみます。 このシナリオでは、データベースからエンタープライズ Bean CMP フィールドへ の転送、およびデータベースへの逆転送の間、正確な 10 進値 (例えば、値 12.25) を保存しません。 このマッピングによって、整数と初期値の置換が起こります (この場合、12)。 したがって、CMP フィールドがこの性質のマッピングを使用するときは、比較演算で CMP フィールドを使用しないでください。
- 幾つかのデータベースは、java.sql.Time のセマンティクスに対応するデータ型をサポートしません。例えば、型 java.sql.Time の CMP フィールドが Oracle DATE 列にマップされると、 列の値の年月日部分はマッピングで切り捨てられるため、時間の比較は予期しない結果をもたらす場合があります。
- データベースによっては、 ゼロ長ストリング値 ( '' ) はヌル値として扱われ、この方法は照会の結果に影響を与えることがあります。 移植性を考えて、ゼロ長ストリング値の使用は避けてください。
- 整数演算規則を使用して 2 整数値間の除算を実行するデータベースもあれば、 非整数規則を使用するデータベースもあります。 この違いは、両方の種類のデータベースを使用する環境では望ましくない場合があります。 移植性を考えて、EJB 照会の際には整数値の除算は避けてください。
UDB DB2 for i5/OS™ i の現行リリースは、「yyyy-mm-dd-hh.mm.ss.nnnnnn」というフォーマットの TIMESTAMP 値のみをサポートしています。これは、java.sql.Timestamp クラスでサポートされる標準フォーマット「yyyy-mm-dd-hh mm.ss.nnnnnn」とは互換性がありません。TIMESTAMP スカラー関数は、java.sql.Timestamp オブジェクトのストリング表記を DB2 UDB for IBM i が認識できる値に変換する場合に使用する必要があります。