データベースからの単一レコードのクエリの例 - Mule 4

データベース用 Anypoint Connector (Database Connector) の ​Query single​ 操作では、データベースから単一レコード (行) を返す SQL クエリを実行し、追加の変換なしで結果のペイロードにアクセスできます。この操作では、返された項目はストリーミングされません。クエリを実行すると、返された行のすべての値がメモリに読み込まれ、ペイロードに返されます。

ただし、注意が必要です。行が大きすぎるとメモリ不足になる可能性があります。 また、接続プーリングを使用する場合は、クエリの実行直後に接続がプールに返されるため、アプリケーションで接続が使い果たされることを心配する必要はありません。

Query single​ 操作を呼び出す方法は ​Select​ 操作と同じですが、​Query single​ 操作を使用すると、実際の SQL クエリで返されるレコード数に関係なく、取得する結果は常に 1 つのみになります。

次の例は、MySQL データベースのテーブルから本の情報を取得する操作を Mule アプリケーション内で設定する方法を示しています。この例を実行するには、次の操作が必要です。

  • BOOK​ というテーブルを作成する SQL ステートメントを実行し、7 件の本情報 (title、author、bookshopName、isbn、price) のレコードを挿入します。

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

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

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

データベースからの単一レコードの照会のフロー
Figure 1. データベースからの単一レコードの照会のフロー

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

SQL データベース接続を設定して Mule アプリケーションを作成する前に、次の SQL ステートメントを実行して ​BOOK​ というテーブルを作成し、7 件の本レコードを挿入します。増分 ​id​ は、テーブルに追加される新しい各本に関連付けられます。たとえば、テーブルに最初に追加された本の ​id​ は ​1​ になり、2 番目の本の ​id​ は ​2​ になります。

USE SYS;

CREATE TABLE BOOK(
    id MEDIUMINT NOT NULL AUTO_INCREMENT,
    title VARCHAR(100),
    author VARCHAR(100),
    bookshopName VARCHAR(100),
    isbn VARCHAR(13),
    price SMALLINT,
    PRIMARY KEY (id)
);

INSERT INTO BOOK(title, author, bookshopName, isbn, price) VALUES('Good Omens', 'Terry Pratchett and Neil Gaiman', 'A.Z. Fell and Co.', '9780060853983', 50);
INSERT INTO BOOK(title, author, bookshopName, isbn, price) VALUES('A Wizard of Earthsea', 'Ursula K. Le Guin', 'A.Z. Fell and Co.', '9780547773742', 20);
INSERT INTO BOOK(title, author, bookshopName, isbn, price) VALUES('IT', 'Stephen King', 'A.Z. Fell and Co.', '9781508297123', 20);
INSERT INTO BOOK(title, author, bookshopName, isbn, price) VALUES('The Nice and Accurate Prophecies of Agnes Nutter', 'Agnes Nutter', 'A.Z. Fell and Co.', '000000000000', 200);
INSERT INTO BOOK(title, author, bookshopName, isbn, price) VALUES('Cujo', 'Stephen King', 'A.Z. Fell and Co.', '9781501192241', 20);
INSERT INTO BOOK(title, author, bookshopName, isbn, price) VALUES('Nation', 'Terry Pratchett', 'A.Z. Fell and Co.', '9780552557795', 30);
INSERT INTO BOOK(title, author, bookshopName, isbn, price) VALUES('The Ocean at the End of the Lane', 'Neil Gaiman', 'A.Z. Fell and Co.', '9780062459367', 30);

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 (パスワード)​: mysql

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

  8. [Advanced (詳細)]​ タブで ​[Pooling profile (プーリングプロファイル)]​ 項目を ​[Edit inline (インライン編集)]​ に設定します。

  9. [Max pool size (最大プールサイズ)]​ 項目を ​5​ に設定します。

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

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

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

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

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

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

Mule アプリケーションの作成、設定、実行、テスト

MySQL データベース接続を設定したら、Mule アプリケーションの作成、設定、実行、テストを行います。

HTTP リスナーと Set Variable コンポーネントの設定によるフローの作成

Mule フローを作成する手順は、次のとおりです。

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

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

  3. [Path (パス)]​ 項目を ​/select/book/{maxId}​ に設定します。
    maxId​ 値パラメーターは、データベースから取得する本レコードの数を示します。データベース接続プールに設定された最大接続数に関係なく、この値を増分できます。

  4. [Mime Type (Mime タイプ)]​ タブで ​[Mime Type (MIME タイプ)]​ 項目を ​application/json​ に設定します。

  5. [Advanced (詳細)]​ タブで ​[Allowed methods (許可されるメソッド)]​ 項目を ​GET​ に設定します。

  6. [Set Variable]​ コンポーネントを ​[Listener]​ ソースの右にドラッグします。
    このコンポーネントでは、​Query single​ 操作から取得されるデータベース結果を保存するための新しい変数を作成します。

  7. [Name (名前)]​ 項目を ​bookCollection​、​[Value (値)]​ 項目を ​#[[]]​ に設定します。

Set Variable コンポーネントの設定
Figure 4. Set Variable の設定

For Each コンポーネント、Query Single 操作、Set Payload コンポーネントの設定

For Each​ コンポーネントを使用して、​HTTP リスナー​で要求された本の数まで反復処理することで、Mule アプリケーションの作成を継続します。 次に、​Query single​ 操作を使用して本の情報を取得し、結果をペイロード変数に保存します。

  1. [For Each]​ コンポーネントを ​[Set Variable]​ の右にドラッグします。

  2. [Collection (コレクション)]​ 項目を ​#[1 to attributes.uriParams.maxId as Number]​ に設定します。
    HTTP 要求 ​/select/book/{maxId}​ を実行すると、この式により、テーブル内の本のコレクションが最初の本 (​1​) から ​maxId​ パラメーターに設定された本の数まで反復処理されます。

    For Each の設定
    Figure 5. For Each の設定
  3. [Query single]​ 操作を ​[For Each]​ コンポーネントにドラッグします。

  4. [Connector configuration (コネクタ設定)]​ 項目を ​Database_Config​ に設定して、MySQL データベース設定に接続します。

  5. [SQL Query Text (SQL クエリテキスト)]​ 項目を ​SELECT id, title, author FROM BOOK WHERE id = :id​ に設定します。
    このクエリでは、データベースから本の情報を選択します。

  6. [Input Parameters (入力パラメーター)]​ 項目を ​![CDATA[#[{'id': payload }]]]​ に設定します。
    この式では、(前述の ​[SQL Query Text (SQL クエリテキスト)]​ 式で参照されている) キーパラメーター ​id​ を、​SELECT​ クエリを使用して取得した本情報の結果値である ​payload​ にマップします。

    Query single の設定
    Figure 6. Query single の設定
  7. 別の ​[Set Variable]​ コンポーネントを ​[Query single]​ 操作の右にドラッグします。

  8. [Name (名前)]​ 項目を ​bookCollection​、​[Value (値)]​ 項目を ​#[vars.bookCollection ++ [payload]]​ に設定します。
    元の変数 ​bookCollection​ に、取得した本情報の ​payload​ が保存されるようになります。

  9. [Set Payload]​ コンポーネントを ​[For Each]​ コンポーネントの右にドラッグします。

  10. [Value (値)]​ 項目を ​#[vars.bookCollection]​ に設定して、変数の内容を新しい出力ペイロードとして保存します。

Set Payload の設定
Figure 7. Set Payload の設定

Mule アプリケーションの実行およびテスト

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

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

  2. コマンドラインで ​curl localhost:8081/select/book/7​ を実行して、アプリケーションをテストします。
    このコマンドでは、プールに設定されている最大接続数 (​5​) に関係なく、テーブルの最初の 7 個の本を選択します。

データベースからの単一レコードを照会するための 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/db http://www.mulesoft.org/schema/mule/db/current/mule-db.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/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd"></mule>
	<http:listener-config name="HTTP_Listener_config" doc:name="HTTP Listener config" doc:id="9501220e-fba8-440b-afdf-14b4ca010fe8" >
		<http:listener-connection host="0.0.0.0" port="8081" />
	</http:listener-config>

	<db:config name="Database_Config" doc:name="Database Config" doc:id="20db2231-3668-48d0-bb60-66f120fc99c8" >
		<db:my-sql-connection host="localhost" port="3306" user="root" password="mysql" database="sys">
			<db:pooling-profile maxPoolSize="5"/>
		</db:my-sql-connection>
	</db:config>

	<flow name="querysingleForeachFlow">
		<http:listener doc:name="Listener" config-ref="HTTP_Listener_config" path="/select/book/{maxId}" outputMimeType="application/json" allowedMethods="GET"/>
		<set-variable variableName="bookCollection" value="#[[]]" />
		<foreach collection="#[1 to attributes.uriParams.maxId as Number]">
			<db:query-single doc:name="Query single" config-ref="Database_Config">
				<db:sql>SELECT id, title, author FROM BOOK WHERE id = :id</db:sql>
				<db:input-parameters><![CDATA[#[{'id': payload }]]]></db:input-parameters>
			</db:query-single>
			<set-variable variableName="bookCollection" value="#[vars.bookCollection ++ [payload]]" />
		</foreach>
		<set-payload value="#[output application/json --- { books : vars.bookCollection }]" />
	</flow>