WSO2 EI - Вставка в базу данных Ограничения - DBReport Mediator - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть API, который будет анализировать и вставлять 20000+ строк в таблицу oracle db, используя DBReport Mediator. Мой код 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 db OPEN по умолчанию равен 1000, но мне нужно вставить 20K + строк, есть ли способ, которым мы могли бы сделать это в EI WSO2 без изменения базы данных Open Ограничение курсора.

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Я столкнулся с подобной проблемой несколько недель назад.К сожалению, ни одна БД не допускает более 1000 вставок за цикл с использованием синтаксиса «Вставить в значения».

Вместо этого я использовал «Вставить в (columnames)» Выберите «columnOne», «columnTwo», .... «columnN» UNIONВСЕ Выберите 'columnOne', 'columnTwo', .... 'columnN' .....

Здесь каждый оператор выбора содержит значения столбцов, и несколько вставок строк объединяются с помощью 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 из запроса медиатора БД в качестве параметра.

0 голосов
/ 18 сентября 2018

Когда я устанавливаю на «False», он работает нормально.

...