WSO2 EI-插入数据库限制-DBReport介体

时间:2018-09-17 22:18:46

标签: wso2 wso2esb wso2carbon wso2dss

我有一个API,它将使用DBReport Mediator解析并将20000+行插入到oracle数据库表中。我的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:超过了最大打开游标,我的默认数据库OPEN游标限制为1000,但是我必须插入20K +行,有没有一种方法可以在WSO2 EI中做到这一点而无需修改数据库打开光标限制。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

当我将其设置为“ False”时,它可以正常工作。

答案 1 :(得分:0)

几周前,我也遇到了类似的问题。不幸的是,没有任何数据库通过使用“插入值”语法允许每次运行不超过1000次插入。

相反,我使用Insert into((列名)选择'columnOne','columnTwo',....'columnN'UNION ALL选择'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作为参数。