我正在尝试使用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。
我不确定我在做什么是正确的方法。我只是在骡子学习曲线的开头。
答案 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)
您可以使用ArrayList
对for
进行迭代,使用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" />