Mule AnyPoint Studio,高效地在数据库中插入大量来自数组的项(json)

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

我有一个类似下面的json作为POST请求的主体

{
  "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中。