在Mule中的数据库中插入Arraylist

时间:2015-04-30 01:12:57

标签: arraylist mule esb

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

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

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

我的骡子流程如下。

<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。

我不确定我在做什么是正确的方法。我只是在骡子学习曲线的开头。

4 个答案:

答案 0 :(得分:5)

您不需要Splitter或Foreach范围。数据库连接器有bulk mode,使连接器接受集合作为有效负载。

  

允许使用一个查询提交数据集合[...]。启用批量模式可以提高应用程序的性能,因为它可以减少单个查询执行的次数。批量模式需要至少带有一个参数的参数化查询。

在插入,更新或删除操作中使用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>

Database Insert组件返回的有效负载是一个数组,其中包含为每个执行的查询更改的行数。在您的情况下,一个数组,其中包含Salesforce Query组件返回的项目大小,如[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>

答案 1 :(得分:1)

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

    <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>

答案 2 :(得分:0)

您可以使用ArrayListfor进行迭代,使用db:dynamic-query逐个插入值。

答案 3 :(得分:0)

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" />