次の方法で共有


DataConnection を使用する際の注意事項

ビジネス ルール エンジンで DataConnection を使用する際の注意事項を、次に示します。

主キーを使用する

主キーが存在する場合、2 つの行が等しいかどうかは、オブジェクトの比較ではなく同じ主キーを使用するかどうかで決まります。 行が同一であると判断された場合、1 つのコピーだけがメモリに保持され、もう一方は解放されます。 これによって、メモリの消費が少なくなります。

DataConnection がルール エンジンに初めてアサートされると、エンジンは常にそのスキーマから主キー情報を検索しようとします。 主キーが存在する場合、主キーの情報が取得され、後続のすべての評価で使用されます。

Note

データベースに変更を加える場合、主キーが必要です。

可能な場合は DataConnection に実行中のトランザクションを提供する

トランザクションがないと、 DataConnection の各クエリと更新によって独自のローカル トランザクションが開始され、異なるクエリによって、ルール評価のさまざまな部分で異なる結果が返される場合があります。 基になるデータベース テーブルが修正されると、矛盾した動作が発生する場合があります。

テーブルが時間の経過とともに変化しない場合はトランザクションを指定せずに DataConnection を使用できますが、 DataConnection が読み取り操作にのみ使用されている場合でもトランザクションを使用することをお勧めします。

ただし、データを更新する場合は、必ずトランザクションを使用してください。

クエリの数が増大する可能性がある

DataConnection に対するクエリは他の結合オブジェクトによってパラメーター化されるため、DataConnection に対して実行されるクエリの数は、DataConnection に到達する結合オブジェクトの数に直接対応します。 したがって、 DataConnection オブジェクトに到達する結合オブジェクトの数が直線的に増加すると、 DataConnection に対するクエリの数も直線的に増加します。 現在、クエリの数を減らす最適化は行われません。

この例を次のルールで示します。

IF A.x = 7 AND DC.y = A.y  
THEN  

ObjectBinding を表し、DC は DataConnection を表し、x と y は A と DC の属性を表します。

テストに合格した A のインスタンスごとに (x = 7)、 DataConnection を使用してクエリが生成されます。 一致するインスタンスが多くある場合は、同じ数のクエリが生成されます。

慎重に OR 条件を使用する

規則で結合 (AND) 条件のみを使用する場合、テストとクエリはできるだけ早く実行されるため、通過するオブジェクトのインスタンスが減ります。 その結果、後続の DataConnection に対するクエリの数は比例して減ります。 不一致 (OR) 条件と DataConnection をルールで一緒に使用すると、すべての条件評価が最終的なクエリにプッシュされます。 ルールで複数の DataConnection が使用されている場合、最後のクエリを除くすべてのクエリは、実質的に Select-ALL クエリ ステートメントになります。

一般的に、OR 条件を持つルールは複数の別ルールに分割することをお勧めします。OR 条件を使用すると、よりアトミックなルールを定義した場合に比べて、パフォーマンスが低下するためです。 このことは、DataConnection を使用するどうかに関係なく当てはまります。

OR 条件を持つ 1 つのルールではなく、結合条件のみで構成される個別のルールの使用も検討できます。 OR 条件では、すべての結合オブジェクトのインスタンスを乗算する速度でクエリの数が増加します。 次の例を参照してください。

IF (A.x ==7 OR A.x == 8) AND DC.y == A.y  
THEN DC.z = 10  

この例では、A は ObjectBinding を表します。DC は DataConnection を表し、x、y、z は A と DC の属性を表します。 A に 100 個のインスタンスがあり、x が最初のオブジェクトで 1、2 番目のオブジェクトが 2、100 番目のオブジェクトで 100 個の場合、 DataConnection に対して 100 個のクエリを実行する必要があります。

前のルールを書き換えて 2 つのルールに分割することをお勧めします。

規則 1

IF A.x =7 AND DC.y = A.y  
THEN DC.z = 10  

規則 2

IF A.x = 8 AND DC.y = A.y  
THEN DC.z = 10  

SQL は一部の述語と関数をサポートしない

ルール エンジンがサポートしている一部の述語と関数は、SQL に対応していません。 対応していないこれらの述語と関数をルールの条件で使用すると、クエリに組み込むことができません。 次の条件は、SQL クエリとして最適化できません。

  • 一部のエンジン組み込み関数に相当する機能は、SQL クエリにありません。 これらは PowerFindFirstFindAll ですDataConnection 列を 1 つ以上の引数として使用することは、クエリの一部として最適化することはできません。たとえば、Power( 2, dc.Column1)。

  • DataConnection 列を正規表現引数 (最初の引数) として使用する組み込みの述語 Match。 たとえば、Match("abc*", dc1.Column2) は有効ですが、Match(dc1.Column1, dc1.Column2) は解釈できません。

  • DataConnection 列を持つユーザー関数をパラメーターの 1 つとして使用する。 たとえば、ユーザー関数はデータベース サーバー上で実行できないため (ビジネス ルール エンジンで実行する必要がある)、c1.M(dc.Column1) は最適化できません。

  • DataConnection に対するセット操作を表すユーザー関数。たとえば、dc.Column1(5)。

  • DataConnection対して ObjectReference を使用する関数。たとえば、ObjecRef(dc) などです。

  • 解釈できない引数がある場合、関数の呼び出し自体が解釈できなくなります (Add(c1.M(dc.Column1), 5) など)。

参照

ビジネス ルール エンジンでのデータ アクセス