一括操作の実行例 - Mule 4

データベース用 Anypoint Connector (Database Connector) では、データを一括管理できるようにする ​Bulk insert​、​Bulk update​、​Bulk delete​ 操作がサポートされています。これにより、1 つの挿入、更新、または削除操作を何度も実行する場合よりもパフォーマンスが向上します。

これらの操作は、対応する単一操作と似ていますが、入力パラメーターをキー - 値のペアで受け取るのではなく、一括操作ではキー - 値のペアのリストとして受け取ることを想定しています。一括操作を実行すれば、不要なステップを回避して次の利点を得ることができます。

  • クエリが 1 回だけ解析される

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

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

  • RDBMS で一括操作を実行できる。

一括操作の一部のステートメントが正常に実行されても、他のステートメントがエラーとなることがあります (たとえば、​Bulk insert​ 操作で 100 行のうち 1 行の挿入に失敗すると、エラーの内容を示す例外が 1 件スローされます)。実行を直ちに中止して残りの操作をすべて無視するか、または残りのステートメントの実行を継続するかは、ドライバーが決定します。どちらの場合でも、エラーが発生した場合には、Mule アプリケーションログでエラーの原因を確認してください。

次の例は、MySQL データベースで顧客データと商品データを挿入、更新、削除する操作を Mule アプリケーションで設定する方法を示しています。この例を実行するには、次の操作が必要です。

  • CUSTOMERS​ と ​PRODUCTS​ という 2 つのテーブルを作成する SQL ステートメントを実行します。

  • SQL データベース接続を設定します。

  • Mule アプリケーションを作成します。

  • アプリケーションを実行し、curl コマンドを使用してアプリケーションをテストします。

Bulk insert、Bulk update、Bulk delete のフロー

データベースのテーブルの作成

SQL データベース接続を設定して Mule アプリケーションを作成する前に、次の SQL ステートメントを実行して ​CUSTOMERS​ と ​PRODUCTS​ というテーブルを作成し、4 件の商品データを ​PRODUCTS​ テーブルに挿入します。

CREATE DATABASE DEMO;

USE DEMO;

CREATE TABLE CUSTOMERS (
ID bigint AUTO_INCREMENT PRIMARY KEY,
NAME varchar(30) NOT NULL,
LAST_NAME varchar(30) NOT NULL
);

CREATE TABLE PRODUCTS (
ID bigint AUTO_INCREMENT PRIMARY KEY,
PRICE numeric(8, 2) NOT NULL,
ITEM varchar(30) NOT NULL
);

INSERT INTO PRODUCTS (PRICE, ITEM) values (50.0, 'shampoo');
INSERT INTO PRODUCTS (PRICE, ITEM) values (150.5, 'olive oil');
INSERT INTO PRODUCTS (PRICE, ITEM) values (11, 'coconut oil');
INSERT INTO PRODUCTS (PRICE, ITEM) values (133, 'wine');

MySQL データベース接続の設定

テーブルを作成したら、Anypoint Studio に移動して MySQL データベース接続を設定します。

  1. Studio で新しい Mule プロジェクトを作成します。

  2. [Global Elements (グローバル要素)]​ ビューに移動します。

  3. [Create (作成)]​ をクリックして、​[Choose Global Type (グローバル種別の選択)]​ ビューを開きます。

  4. [Filter (検索条件)]​ 項目に「​http​」と入力し、​[HTTP Listener config (HTTP リスナー設定)]​ を選択して ​[OK]​ をクリックします。
    この設定は、Mule アプリケーションフローを開始する HTTP ​Listener​ ソース用です。

  5. [HTTP Listener config (HTTP リスナー設定)]​ ウィンドウで、次の項目に入力します。

    • Protocol (プロトコル)​: HTTP (Default)

    • Host (ホスト)​: All Interfaces [0.0.0.0] (default)

    • Port (ポート)​: 8081

  1. [OK]​ をクリックします。

  2. [Global Elements (グローバル要素)]​ ビューで ​[Create (作成)]​ をクリックして ​[Choose Global Type (グローバル種別の選択)]​ ビューを開きます。

  3. [Filter (検索条件)]​ 項目に「​database​」と入力し、​[Database Config (データベース設定)]​ を選択して ​[OK]​ をクリックします。

  4. [Database Config (データベース設定)]​ ウィンドウで ​[Name (名前)]​ を ​dbConfig​ に設定します。

  5. [Connection (接続)]​ 項目で ​[MySQL Connection (MySQL 接続)]​ を選択します。

  6. [Configure (設定)]​ をクリックし、必要な MySQL JDBC ドライバーを追加して、次のいずれかを選択します。

    • Add recommended library (推奨されるライブラリを追加)
      推奨されるライブラリをインストールします。

    • Use local file (ローカルファイルを使用)
      ローカルファイルを使用してライブラリをインストールします。

    • Add Maven dependency (Maven 連動関係を追加)
      Maven 連動関係をインストールしてプロジェクトに追加します。

  7. [Connection (接続)]​ セクションで、次の項目に入力します。

    • Host (ホスト)​: localhost

    • Port (ポート)​: 3306

    • User (ユーザー)​: root

    • Password (パスワード)​: mulesoft

    • Database (データベース)​: demo

  8. [Test Connection (接続をテスト)]​ をクリックして、Mule がデータベースに接続できることを確認します。

  9. [OK]​ をクリックします。

HTTP リスナーのグローバル要素設定

次のスクリーンショットは、データベースのグローバル要素設定を示しています。

「[Host (ホスト)]、[Port (ポート)]、[User (ユーザー)]、[Password (パスワード)] 項目を設定するデータベースの一般設定」

最初のフローの作成

最初のフローは、顧客の項目を ​CUSTOMERS​ テーブルに一括挿入します。このフローを作成する手順は、次のとおりです。

  1. [Mule Palette (Mule パレット)]​ ビューで、[HTTP] の ​[Listener]​ ソースを選択してキャンバスにドラッグします。
    このソースは受信 HTTP メッセージ属性をリスンすることでフローを開始します。

  2. [Connector configuration (コネクタ設定)]​ 項目で ​HTTP_Listener_config​ グローバル設定を選択します。

  3. [Path (パス)]​ を ​/insert​ に設定します。

  4. [Bulk insert]​ 操作を ​[Listener]​ ソースの右にドラッグします。

  5. [Connector configuration (コネクタ設定)]​ で ​Database_Config​ を選択します。

  6. [Input Parameters (入力パラメーター)]​ に次の式を入力します。

    [{'id': 2, 'name': 'George', 'lastName': 'Costanza'}, {'id': 3, 'name': 'Cosmo', 'lastName': 'Kramer'}]

  7. [SQL Query text (SQL クエリテキスト)]​ に以下を入力します。

    INSERT INTO CUSTOMERS (NAME, LAST_NAME) values (:name, :lastName)

2 つ目のフローの作成

2 つ目のフローは、​PRODUCTS​ テーブルで商品の価格を一括更新します。このフローを作成する手順は、次のとおりです。

  1. [Mule Palette (Mule パレット)]​ ビューで、[HTTP] の ​[Listener]​ ソースを選択して、最初のフローの下にドラッグします。
    このソースは受信 HTTP メッセージ属性をリスンすることでフローを開始します。

  2. [Connector configuration (コネクタ設定)]​ 項目で ​HTTP_Listener_config​ グローバル設定を選択します。

  3. [Path (パス)]​ を ​update​ に設定します。

  4. [Set Payload]​ コンポーネントを ​[Listener]​ ソースの右にドラッグします。

  5. [Value (値)]​ に次の式を入力します。

    [{
    	discountRate: 0.1,
    	price: 50
    },
    {
    	discountRate: 0.2,
    	price: 150.5
    }]
  6. [Bulk update]​ 操作を ​[Set Payload]​ ソースの右にドラッグします。

  7. [Connector configuration (コネクタ設定)]​ で ​Database_Config​ を選択します。

  8. [SQL Query text (SQL クエリテキスト)]​ に次の式を入力します。

    UPDATE PRODUCTS SET PRICE = PRICE * :discountRate WHERE PRICE = :price

3 つ目のフローを作成する

3 つ目のフローは、​PRODUCTS​ テーブルから商品データを一括削除します。このフローを作成する手順は、次のとおりです。

  1. [Mule Palette (Mule パレット)]​ ビューで、[HTTP] の ​[Listener]​ ソースを選択して、最初のフローの下にドラッグします。
    このソースは受信 HTTP メッセージ属性をリスンすることでフローを開始します。

  2. [Connector configuration (コネクタ設定)]​ 項目で ​HTTP_Listener_config​ グローバル設定を選択します。

  3. [Path (パス)]​ を ​/delete​ に設定します。

  4. [Set Payload]​ コンポーネントを ​[Listener]​ ソースの右にドラッグします。

  5. [Value (値)]​ に次の式を入力します。

    [{
    	price: 11
    },
    {
    	price: 133
    }]
  6. [Bulk delete]​ 操作を ​[Set Payload]​ コンポーネントの右にドラッグします。

  7. [Connector configuration (コネクタ設定)]​ で ​Database_Config​ を選択します。

  8. [SQL Query text (SQL クエリテキスト)]​ に次の式を入力します。

    DELETE FROM PRODUCTS WHERE PRICE = :price

Mule アプリケーションの実行とテスト

Mule アプリケーションを実行およびテストする手順は、次のとおりです。

  1. Studio でプロジェクトを保存します。

  2. [Run (実行)] > [Run (実行)]​ をクリックしてアプリケーションをデプロイします。

  3. インターネットブラウザーで、次の CURL コマンドを実行してアプリケーションをテストします。
    curl http://localhost:8081/insert
    curl http://localhost:8081/update
    curl http://localhost:8081/delete

Mule アプリケーションの XML の例

この例のフローをすばやく Mule アプリケーションに読み込むには、次のコードを Studio XML エディターに貼り付けます。

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:db="http://www.mulesoft.org/schema/mule/db" xmlns:http="http://www.mulesoft.org/schema/mule/http"
	xmlns="http://www.mulesoft.org/schema/mule/core"
	xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/db http://www.mulesoft.org/schema/mule/db/current/mule-db.xsd">
	<db:config >
		<db:my-sql-connection host="localhost" port="3306" user="root" password="mulesoft" database="demo" />
	</db:config>
	<http:listener-config name="HTTP_Listener_config" >
		<http:listener-connection host="0.0.0.0" port="8081" />
	</http:listener-config>
	<flow name="dbcon-demoFlow">
		<http:listener config-ref="HTTP_Listener_config" path="/insert"/>
		<db:bulk-insert config-ref="Database_Config">
			<db:bulk-input-parameters ><![CDATA[#[[{'id': 2, 'name': 'George', 'lastName': 'Costanza'}, {'id': 3, 'name': 'Cosmo', 'lastName': 'Kramer'}]]]]></db:bulk-input-parameters>
			<db:sql ><![CDATA[INSERT INTO CUSTOMERS (NAME, LAST_NAME) values (:name, :lastName)]]></db:sql>
		</db:bulk-insert>
	</flow>
	<flow name="dbcon-demoFlow1" >
		<http:listener config-ref="HTTP_Listener_config" path="update"/>
		<set-payload value="#[[{
	discountRate: 0.1,
	price: 50
},
{
	discountRate: 0.2,
	price: 150.5
}]]" doc:name="Set Payload" />
		<db:bulk-update config-ref="Database_Config">
			<db:sql ><![CDATA[UPDATE PRODUCTS SET PRICE = PRICE * :discountRate WHERE PRICE = :price]]></db:sql>
		</db:bulk-update>
	</flow>
	<flow name="dbcon-demoFlow2" >
		<http:listener config-ref="HTTP_Listener_config" path="/delete"/>
		<set-payload value="#[[{
	price: 11
},
{
	price: 133
}]]" doc:name="Set Payload" />
		<db:bulk-delete doc:name="Bulk delete" config-ref="Database_Config">
			<db:sql ><![CDATA[DELETE FROM PRODUCTS WHERE PRICE = :price]]></db:sql>
		</db:bulk-delete>
	</flow>
</mule>