Database Connector の例 - Mule 4

データベース用 Anypoint Connector (Database Connector) の例は、データベース接続の設定、データベースの照会、ストアドプロシージャーの実行、DDL ステートメントの実行、スクリプトの実行、データベーストランザクションの実行、一括操作の使用、カスタムデータ型の設定に役立ちます。

  • データベース接続の設定
    一般的なデータベースと汎用データベースの両方に接続します。また、グローバルデータソースへの接続、JDBC ドライバーの設定、接続プーリングの設定、TNS を使用した Oracle データベースへの接続を行うようにコネクタを設定します。

  • データベースの照会
    データベースからデータを照会する ​Select​ 操作を設定します。

  • データベースからの単一レコードのクエリ
    MySQL データベースのテーブルから本の情報を取得する ​Query single​ 操作を Mule アプリケーション内で設定します。

  • データの挿入、更新、削除
    データを管理するように ​Insert​、​Update​、​Delete​ 操作を設定します。

  • ストアドプロシージャーの実行
    input​、​output​、および ​input-output​ パラメーターを組み合わせる ​Stored Procedure​ 操作を設定します。また、ストアドプロシージャーの日付を設定します。

  • UDT を使用する Oracle ストアドプロシージャーのコール
    UDT を入力および出力パラメーターとして使用する Oracle データベースストアドプロシージャーをコールする ​Stored procedure​ 操作を設定します。また、​createStruct​ および ​createArray​ DataWeave 関数を使用してアプリケーションデータをカスタム型にマップします。

  • DDL ステートメントの実行
    テーブルや他のデータ構造内のデータを作成または変更する DDL ステートメントを実行する ​Execute DDL​ 操作を設定します。

  • ​一括操作の実行
    各入力パラメーターが 1 つの値のみを取る場合に使用する ​Bulk insert​、​Bulk update​、​Bulk delete​ 操作を設定します。

  • スクリプトの実行
    スクリプトを 1 つのステートメントとして実行する ​Execute script​ 操作を設定します。

  • データベースのデータ型の設定
    特定の接続プロバイダーに接続している場合に使用するカスタムデータ型を設定します。

  • データベーストランザクションの設定
    データベース操作をトランザクションのコンテキストで実行します。

一括操作の実行

insert​、​update​、​delete​ 操作は、各入力パラメーターが 1 つの値のみを取る場合に使用できます。または、一括操作では、一連のパラメーター値を使用して 1 つのクエリを実行できます。

一括操作を実行すれば、不要なステップを回避して次の利点を得ることができます。

  • クエリは 1 回のみ解析される。

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

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

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

このユースケースでは、コネクタは ​<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>

一括操作を使用しない場合、​delete​ 操作の実行時に 1 つの条件 ​(POSITION = X)​ のみが提供されると、複数の行が条件に一致して削除される可能性があります。 同じ概念が更新にも適用されます。​UPDATE PRODUCTS set PRICE = PRICE * 0.9 where PRICE > :price​ を使用するときに、複数の商品に 10% 割引を適用したい場合でも、​price​ 入力パラメーターは 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 つのクエリを実行する必要があります。

  • クエリが解析される。

  • パラメーターが解決される。

  • データベースへの接続が取得される (プールから接続を取得するか、新しい接続を確立する)。

  • すべてのネットワークオーバーヘッドが支払われる。

  • RBMS でクエリを処理し、変更を適用する。

  • 接続が解放される。

いずれかの操作の実行中にエラーが発生した場合 (たとえば、100 行の一括挿入のうち 1 行の挿入に失敗した場合)、1 つの例外がスローされます。

一括操作の一部のステートメントは正常に実行できても、他のステートメントはエラーになる可能性があります。この場合、ドライバーが次のいずれかを実行します。

  1. 実行をすぐに停止し、残りのすべての操作を無視する

  2. 残りのステートメントの実行を続行する。

どちらの場合も、エラーが発生するたびにアプリケーションログを調べて、失敗の原因を確認できます。この場合、問題の原因を説明する 1 つの例外がスローされます。