在 Mule 的数据库中插入 Arraylist

Insert Arraylist in Database in Mule

我正在尝试使用 Mule ESB 将 ArrayList 的内容插入到 SQL 服务器数据库。 ArrayList 看起来像

[
    {Id=a1o90000001muvWAAQ, Billing_Number__c=1000005, type=Call_Log__c}, 
    {Id=a1o90000001muvXAAQ, Billing_Number__c=1000006, type=Call_Log__c}
]

我应该如何以优化的方式将其插入数据库?

我的 mule 流程如下。

<sfdc:query config-ref="Salesforce__Basic_authentication" query="#[flowVars.query]" 
        doc:name="Salesforce"/>
<set-variable variableName="result" value="#[new java.util.ArrayList()]" 
        doc:name="Variable"/>
<foreach doc:name="For Each">
    <set-variable variableName="itrresult" value="#result.add(message.payload)]" 
            doc:name="Variable"/>
</foreach>
<splitter expression="#[flowVars.result]" doc:name="Splitter"/>
<logger message="#[payload['Id']]" level="INFO" doc:name="Logger"/>

#[payload['Id']] 给我日志中的 Id LoggerMessageProcessor: a1o90000001mzgzAAA。

不过我不确定我的做法是否正确。我刚开始学习 Mule。

您可以使用 for 遍历 ArrayList,使用 db:dynamic-query 一个接一个地插入值。

使用拆分器拆分数组并单独插入:

    <splitter expression="#[payload]" />
    <db:insert config-ref="Config" doc:name="Database">
        <db:parameterized-query><![CDATA[insert into xx(Id, Billing_Number__c, type) values('#[payload['Id']]','#[payload['Billing_Number__c']]','#[payload['type']]');]]></db:parameterized-query>
    </db:insert>

您不需要 Splitter 或 Foreach 作用域。数据库连接器有一个 bulk mode 使连接器接受一个集合作为有效负载。

Enable to submit collections of data with one query, [...]. Enabling bulk mode improves the performance of your applications as it reduces the number of individual query executions. Bulk mode requires a parameterized query with at least one parameter.

在插入、更新或删除操作中使用 bulkMode="true" 启用它。

编辑: 在您的 Salesforce 查询组件之后使用它:

    <sfdc:query config-ref="" query="#[flowVars.query]" doc:name="Salesforce"/>
    <db:insert config-ref="" bulkMode="true" doc:name="Database">
        <db:parameterized-query>
            <![CDATA[INSERT INTO TABLE (ID, BILLING_NUMBER__C, TYPE)  
            VALUES (#[payload.Id], #[payload.Billing_Number__c], #[payload.type]);]]>
        </db:parameterized-query>
    </db:insert>

数据库插入组件返回的有效负载是一个数组,其中包含为执行的每个查询更改的行数。在您的情况下,一个数组的大小是 Salesforce 查询组件返回的项目数,例如 [1, 1, 1, ...].

如果您仍然需要登录,请执行以下操作:

    <sfdc:query config-ref="" query="#[flowVars.query]" doc:name="Salesforce"/>
    <foreach doc:name="For Each">
       <logger message="#[payload.Id]" level="INFO" doc:name="Logger"/>
    </foreach>
    <db:insert config-ref="" bulkMode="true" doc:name="Database">
        <db:parameterized-query><!-- the query --></db:parameterized-query>
    </db:insert>

或者这样:

    <sfdc:query config-ref="" query="#[flowVars.query]" doc:name="Salesforce"/>
    <foreach doc:name="For Each">
       <logger message="#[payload.Id]" level="INFO" doc:name="Logger"/>
        <db:insert config-ref="" doc:name="Database"><!-- bulkMode disabled -->
            <db:parameterized-query><!-- the query --></db:parameterized-query>
        </db:insert>
    </foreach>

Mule 支持批量模式插入数据集合。我更喜欢在 SQL 语句中带有标签的 db:in-param 元素。配置已通过 Mule 3.8.5 测试。

<db:insert config-ref="databaseConfiguration" bulkMode="true" doc:name="Database">
    <db:parameterized-query>
    <![CDATA[INSERT INTO T_ORDER (ORDER_NO,CUSTOMER_NO) VALUES (:orderNo, :customerNo)]]>
    </db:parameterized-query>
    <db:in-param name="orderNo"  value="#[payload.orderNo]" />
    <db:in-param name="customerNo"  value="#[payload.customerNo]" />
</db:insert>

批量模式提供了更好的性能。确保针对此用例正确配置了 DBMS。

在调用 db:insert 组件之前,可以对具有大量条目的集合进行分区,例如分成 100 个条目的子集合。

<!-- Sample: Collection with 1.000 entries -->
<!-- will be chunked into sub collections with 100 entries -->
<foreach batchSize="100" />