Mule AnyPoint Studio,高效地在数据库中插入大量来自数组的项(json)
我有一个类似下面的json作为POST请求的主体Mule AnyPoint Studio,高效地在数据库中插入大量来自数组的项(json),mule,sql-insert,mule-studio,mulesoft,mule-esb,Mule,Sql Insert,Mule Studio,Mulesoft,Mule Esb,我有一个类似下面的json作为POST请求的主体 { "summary": { "transactionId": "5003k00000zSuNaAAK", "transactionNumber": "T12345", "overall": 100, "date": "15/05/2020", "details": [ { "transactionDetailId": "CC12345", "prod
{
"summary": {
"transactionId": "5003k00000zSuNaAAK",
"transactionNumber": "T12345",
"overall": 100,
"date": "15/05/2020",
"details": [
{
"transactionDetailId": "CC12345",
"product_code": 223242234,
"price": 1500,
"amount": 1000
},
{
"transactionDetailId": "DD12345",
"product_code": 679685675,
"price": 1100,
"amount": 90
},
{
"transactionDetailId": "SS12345",
"product_code": 345346643,
"price": 2000,
"amount": 300
},
.......other 100 items
]
}
}
在我的AnyPoint Studio项目中,使用forEach模块循环details[]
和批量插入,我能够执行插入,并将细节数组的所有项写入我的postgres DB。
因此,每个项目都将执行一个INSERT
考虑到包含1000多个项目的阵列,是否有更有效的方法执行此操作 更好的方法是提取dteails[]作为有效负载,然后基于此数组项进行大容量插入。不涉及forEach,而且工作速度更快。在这种情况下也使用流,内存需求会更好。正如我建议的,我尝试实现下面的解决方案 但我收到一条错误消息,告诉我“不可能将java.util.ArrayList的实例转换为int
<ee:transform doc:name="Transform Message" doc:id="22030639-b08a-4036-b1cd-9a644753cc5a" >
<ee:message >
<ee:set-payload ><![CDATA[%dw 2.0
output application/java
---
payload.summary.*details map {
transactionDetailIdParam: $."transactionDetailId",
productCodeParam: $."product_code",
priceParam: $."price",
amountParam: $."amount"
}]]></ee:set-payload>
</ee:message>
</ee:transform>
<logger level="INFO" doc:name="Logger" doc:id="6e827f87-54a8-4084-a715-68f4bb64aff0" message="#[payload.transactionDetailIdParam]"/>
<db:bulk-insert doc:name="Bulk insert" doc:id="4bf6f363-56c9-4084-87d7-233c52d92073" config-ref="PostgresDB">
<db:bulk-input-parameters ><![CDATA[#[output application/java
---
[{
p1: payload.transactionDetailIdParam,
p2: payload.productCodeParam,
p3: payload.priceParam,
p4: payload.amountParam
}]]]]></db:bulk-input-parameters>
<db:sql ><![CDATA[INSERT INTO public."TB_DETTAGLIO"(
"transactionDetailId", product_code, price, amount)
VALUES (:p1, :p2, :p3, :p4);]]></db:sql>
</db:bulk-insert>```
```
如果我通过只包含项目数组的paylod,我需要为每个项目循环并将每个项目写入我的数据库……我不会这么说。这就是创建批量插入的目的。它更好,因为它在批量过程中循环,所以速度更快。快得多……如何使用基于我的新负载中的数组?批量与常规插入完全相同。只需输入负载是项的数组,SQL查询就像它在处理一个项。您不能使用原始负载,因为它不是数组。提取数组详细信息,然后您就可以使用它。如果您需要原始负载中的某些内容,如transactionNumber,请将其保存到vars a中nd在这些变量的公共sql中使用它。如果需要更多帮助,请告诉我。但是大容量插入中的有效负载是数组的一项。以前的有效负载已消失。这就是我建议将其值存储在变量中的原因。它应该看起来像插入到公共中。“detailsTable”(“transactionDetailId”、产品代码、价格、金额)值(flowVars.transactionDetailId、有效载荷、产品代码……)如果您在Mule 3中。