2015-03-20 2 views
0

Я использую Spring Batch для переноса данных из XML в базу данных Oracle.Spring Batch - Multi-File-Resource - Принимает то же время, что и один поток?

При выполнении одной резьбы процесс занимает 80-90 минут, чтобы вставить 20 тыс. Пользователей прибл.

Я хочу уменьшить его до более чем половины, но даже используя Multi File Resource, я не могу этого достичь.

У меня есть один XML должен быть обработан таким образом, я начал просто добавив

  • задач исполнителя и делает читатель синхронизирован, но не в состоянии достичь усиления.

Так что я делаю, я разделяю XML на несколько XMLS и хочу попробовать с Multi File Resource. Вот конфигурация.

<batch:job id="importJob"> 

     <batch:step id="step1Master"> 
      <batch:partition handler="handler" partitioner="partitioner" /> 
     </batch:step> 

</batch:job> 

<bean id="handler" 
     class="org.springframework.batch.core.partition.support.TaskExecutorPartitionHandler"> 
     <property name="taskExecutor" ref="taskExecutor" /> 
     <property name="step" ref="slaveStep" /> 
     <property name="gridSize" value="20" /> 
    </bean> 

    <batch:step id="slaveStep"> 
     <batch:tasklet transaction-manager="transactionManager" 
      allow-start-if-complete="true"> 
      <batch:chunk reader="reader" writer="writer" 
       processor="processor" commit-interval="1000" skip-limit="1500000"> 
       <batch:skippable-exception-classes> 
        <batch:include class="java.lang.Exception" /> 
       </batch:skippable-exception-classes> 
      </batch:chunk> 


     </batch:tasklet> 

    </batch:step> 

    <bean id="taskExecutor" 
     class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> 
     <property name="corePoolSize" value="100" /> 
     <property name="maxPoolSize" value="300" /> 
     <property name="allowCoreThreadTimeOut" value="true" /> 
    </bean> 


    <bean id="partitioner" 
     class="org.springframework.batch.core.partition.support.MultiResourcePartitioner" 
     scope="step"> 
     <property name="keyName" value="inputFile" /> 
     <property name="resources" 
      value="file:/.../*.xml" /> 
    </bean> 



    <bean id="processor" 
     class="...Processor" 
     scope="step" /> 

    <bean id="reader" class="org.springframework.batch.item.xml.StaxEventItemReader" 
     scope="step"> 
     <property name="fragmentRootElementName" value="user" /> 
     <property name="unmarshaller" ref="userDetailUnmarshaller" /> 
     <property name="resource" value="#{stepExecutionContext[inputFile]}" /> 
    </bean> 

Мой единственный XML-файл содержит пользователей около 1000, и я пытаюсь иметь 20 файлов.

Я сохранил commit-interval = 1000, так как каждый файл имеет 1000 записей для вставки в БД.

Необходимо ли соответствующим образом скорректировать интервал?

Я использую ORACLE DB, нужно ли мне управлять пулами. Текущий Пул ORACLE DB настроен в JBOSS Min Pool = 100 Max Pool = 300

Я вижу, войдя как

17:01:50,553 DEBUG [Writer] (taskExecutor-11) [UserDetailWriter] | user added 
17:01:50,683 DEBUG [Writer] (taskExecutor-15) [UserDetailWriter] | user added 
17:01:51,093 DEBUG [Writer] (taskExecutor-11) [UserDetailWriter] | user added 
17:01:59,795 DEBUG [Writer] (taskExecutor-12) [UserDetailWriter] | user added 
17:02:00,385 DEBUG [Writer] (taskExecutor-12) [UserDetailWriter] | user added 
17:02:00,385 DEBUG [Writer] (taskExecutor-12) [UserDetailWriter] | user added 

Кажется, в настоящее время создано несколько потоков, но до сих пор я не вижу каких-либо улучшений производительности Вот?

Пожалуйста, предложите, что я делаю неправильно?

+0

несколько ресурсов файла не будут работать так, как вы думали. он будет выбирать один за другим и делить его на писателя один за другим. вот почему вы не увидите прироста производительности. многостраничный ресурс, предназначенный для запуска один за другим не каждый раз за счет нескольких потоков –

+0

Если это так, то чем преимущество параллельной обработки? – Ketan

ответ