Я использую 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
Кажется, в настоящее время создано несколько потоков, но до сих пор я не вижу каких-либо улучшений производительности Вот?
Пожалуйста, предложите, что я делаю неправильно?
несколько ресурсов файла не будут работать так, как вы думали. он будет выбирать один за другим и делить его на писателя один за другим. вот почему вы не увидите прироста производительности. многостраничный ресурс, предназначенный для запуска один за другим не каждый раз за счет нескольких потоков –
Если это так, то чем преимущество параллельной обработки? – Ketan