WSO2 EI - 插入数据库限制 - DBReport Mediator

WSO2 EI - Insert to Database Restrictions - DBReport Mediator

我有一个 api,它将使用 DBReport 调解器解析 20000 多行并将其插入 oracle 数据库 table。我的 api 代码:

<api xmlns="http://ws.apache.org/ns/synapse" name="AllMembers" context="/AllMembers">
       <resource methods="GET">
          <inSequence>
             <send>
                <endpoint>
                   <http uri-template="https://xxxxxxxxxxxxxxxxxxxxxx"/>
                   <property name="Authorization" value="Basic xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" scope="transport"/>
                </endpoint>
             </send>
          </inSequence>
          <outSequence>
             <dbreport useTransaction="true">
                <connection>
                   <pool>
                      <dsName>xxxxxxxxx</dsName>
                   </pool>
                </connection>
                <statement>
                   <sql>DELETE FROM MEMBERS_API_TBL </sql>
                </statement>
             </dbreport>
             <foreach id="foreach_1" expression="//jsonObject">
                <sequence>
                   <dbreport useTransaction="true">
                      <connection>
                         <pool>
                            <dsName>xxxxxxxxx</dsName>
                         </pool>
                      </connection>
                      <statement>
                         <sql>INSERT INTO MEMBERS_API_TBL VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)</sql>
                         <parameter expression="//status" type="VARCHAR"/>
                         <parameter expression="//xxxx" type="VARCHAR"/>
                         <parameter expression="//account_id" type="NUMERIC"/>
                         <parameter expression="//fields//xxxx" type="VARCHAR"/>
                         <parameter expression="//fields//xxxx" type="VARCHAR"/>
                         <parameter expression="//fields//xxxxx" type="VARCHAR"/>
                         <parameter expression="//fields//xxxxxx" type="VARCHAR"/>
                         <parameter expression="//fields//xxxxx" type="VARCHAR"/>
                         <parameter expression="//fields//xxxxx" type="VARCHAR"/>
                         <parameter expression="//fields//xxxxx" type="VARCHAR"/>
                         <parameter expression="//fields//xxxxx" type="VARCHAR"/>
                         <parameter expression="//member_id" type="NUMERIC"/>
                         <parameter expression="//email" type="VARCHAR"/>
                         <parameter expression="get-property('SYSTEM_DATE')" type="VARCHAR"/>
                      </statement>
                   </dbreport>
                </sequence>
             </foreach>
             <respond/>
          </outSequence>
       </resource>
    </api>        

当我执行时,我得到 ORA-01000:超出最大打开游标数,我的默认 db OPEN Cursor 限制是 1000,但我必须插入 20K+ 行,有没有一种方法我们可以在 WSO2 EI 中做到这一点而不修改数据库打开游标限制。

有什么建议吗?

当我将 "False" 设置为 "False" 时,效果很好。

几周前我遇到过类似的问题。不幸的是,通过使用 Insert into Values 语法,没有数据库允许每个 运行 插入超过 1000 次。

相反,我使用 Insert into (columnames) Select 'columnOne', 'columnTwo',....'columnN' UNION ALL Select 'columnOne', 'columnTwo',.....'columnN' .....

这里,每个select语句包含列值,多行插入由UNION ALL连接。

  <iterate continueParent="true" expression="$body//*[local-name()='rootElement']" sequential="true">
        <target>
           <sequence>
              <property expression="//ColumnOne//text()" name="ColumnOne" scope="default" type="STRING" />
              <property expression="//ColumnTwo/text()" name="ColumnTwo" scope="default" type="STRING" />
              <property expression="//ColumnN/text()" name="ColumnN" scope="default" type="STRING" />
              <property name="Quotes" scope="default" type="STRING" value="'" />
              <filter regex="false" source="boolean(get-property('operation','concat-data'))">
                 <then>
                    <property expression="fn:concat('Insert into TableName(ColumnOne,ColumnTwo,....,ColumnN) values ','(',get-property('Quotes'),get-property('ColumnOne'),get-property('Quotes'),',',get-property('Quotes'),get-property('ColumnTwo'),get-property('Quotes'),',',get-property('Quotes'),get-property('ColumnN'),get-property('Quotes'),')')" name="concat-data" scope="operation" type="STRING" />
                 </then>
                 <else>
                    <property expression="fn:concat(get-property('operation','concat-data'),',','(',get-property('Quotes'),get-property('ColumnOne'),get-property('Quotes'),',',get-property('Quotes'),get-property('ColumnTwo'),get-property('Quotes'),',',get-property('Quotes'),get-property('ColumnN') ,get-property('Quotes'),')')" name="concat-data" scope="operation" type="STRING" />
                 </else>
              </filter>
           </sequence>
        </target>
     </iterate>
     <property expression="get-property('operation','concat-data')" name="BulkInsertQuery" scope="default" type="STRING" />

您可以提取数据库中介查询中的 属性 BulkInsertQuery 作为参数。