在 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" />
我正在尝试使用 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" />