一括操作の実行方法

上記の insert、update、delete 操作は、各入力パラメータが 1 つの値のみを取る場合に適しています。

たとえば、削除時に、複数の行が条件に一致して削除される可能性があるときに、1 つの条件 (POSITION = X) のみが提供される場合です。同じ概念が更新にも適用されます。UPDATE PRODUCTS set PRICE = PRICE * 0.9 where PRICE > :price を実行するときに、複数の商品に 10% 割引を適用することができますが、価格の入力パラメータが 1 つの値のみを取る場合です。

価格の異なる商品に異なる割引率を適用する場合はどのようになるでしょうか? 多くの操作を実行することでこれを実現できます。たとえば、構造 { price : number, discountRate: number} のオブジェクトのリストであるペイロードがある場合、次のコードを実行できます。

<foreach>
  <db:update config-ref="dbConfig">
    <db:input-parameters>
     #[
      {
        'discountRate' : payload.discountRate,
        'price' : payload.price,
      }
    ]
    </db:input-parameters>
    <db:sql>
      UPDATE PRODUCTS set PRICE = PRICE * :discountRate where PRICE > :price
    </db:sql>
  </db:update>
</foreach>

この方法ではジョブは確実に完了しますが、非常に非効率です。リスト内の要素ごとに 1 つのクエリを実行する必要があります。つまり、要素ごとに以下が必要です。

  • クエリを解析する

  • パラメータを解決する

  • DB への接続を取得する (プールに対する接続を取得するか、新しい接続を確立する)

  • すべてのネットワークオーバーヘッドを支払う

  • RBMS でクエリを処理し、変更を適用する必要がある

  • 接続をリリースする

一括操作を実行すれば、このすべてのステップを回避できます。一括操作では、1 つのクエリのみが使用されます。更新ステートメントは一定であり、動的ではありません。変更することは、反復ごとに異なるパラメータセットを指定することのみです。

一括操作でできることは、一連のパラメータ値を使用して 1 つのクエリを実行することです。間違えないでください。これは上記と同じ <foreach> のショートカットではありません。これは JDBC API の機能を使用するため、次の利点があります。

  • クエリの解析が 1 回のみである

  • 実行されるステートメントは 1 つのみのため、必要な DB 接続は 1 つのみである

  • ネットワークオーバーヘッドが最小限に抑えられる

  • RBDMS は一括操作をアトミックに実行できる

このユースケースでは、コネクタは <db:bulk-insert><db:bulk-update><db:bulk-delete> の 3 つの操作を提供します。

これらは、対応する単一操作と非常によく似ていますが、入力パラメータをキー - 値のペアで受け取るのではなく、キー - 値のペアのリストとして受け取ることを想定しています。

例を見てみましょう。

<db:bulk-insert config-ref="dbConfig" >
  <db:bulk-input-parameters>
    #[[{'id': 2, 'name': 'George', 'lastName': 'Costanza'}, {'id': 3, 'name': 'Cosmo', 'lastName': 'Kramer'}]]
  </db:bulk-input-parameters>
  <db:sql>
    insert into customers (id, name, lastName) values (:id, :name, :lastName)
  </db:sql>
</db:bulk-insert>

Was this article helpful?

💙 Thanks for your feedback!

Edit on GitHub