2017-01-06 6 views
0

Я новая весенняя партия. Недавно я попробовал пакет, который будет читать записи из файла и вставить в MariaDB. Но для вставки 10 тыс. Записей его занимает 2 мин 30 сек. Я знаю его слишком много времени. Таблица имеет только 3 столбца без каких-либо ключей.Весна Съемка слишком длинная

Вот моя работа-XML

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:batch="http://www.springframework.org/schema/batch" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/batch 
    http://www.springframework.org/schema/batch/spring-batch-2.2.xsd 
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
"> 

<import resource="../../context.xml" /> 
<import resource="../../database.xml" /> 

<bean id="itemProcessor" class="com.my.sbatch.processors.CustomItemProcessor" /> 

<batch:job id="file_to_db"> 
    <batch:step id="step1"> 
     <batch:tasklet transaction-manager="transactionManager" start-limit="100"> 
      <batch:chunk reader="cvsFileItemReader" 
       writer="databaseItemWriter" commit-interval="10"> 
      </batch:chunk> 
     </batch:tasklet> 
    </batch:step> 
</batch:job> 

<bean id="multiResourceReader" 
    class=" org.springframework.batch.item.file.MultiResourceItemReader"> 
    <property name="resources" 
     value="file:batch/csv/processing/*.csv" /> 
    <property name="delegate" ref="cvsFileItemReader" /> 
</bean> 

<bean id="mappingBean" class="com.my.sbatch.bean.Batch1Bean" 
    scope="prototype" /> 

<bean name="customFieldSetMapper" class="com.my.sbatch.core.CustomFieldSetMapper"> 
    <property name="classObj" ref="mappingBean"/> 
</bean> 

<bean id="cvsFileItemReader" class="com.my.sbatch.customReader.CustomItemReader" scope="step"> 

    <property name="resource" value="file:#{jobParameters['inputFile']}" /> 

    <property name="lineMapper"> 
     <bean class="com.my.sbatch.core.CustomLineMapper"> 

      <property name="lineTokenizer"> 
       <bean 
        class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer"> 
        <property name="delimiter" value="#{jobParameters['delimiter']}" /> 
       </bean> 
      </property> 

      <property name="fieldSetMapper" ref="customFieldSetMapper" /> 
     </bean> 
    </property> 

</bean> 

<bean id="databaseItemWriter" class="org.springframework.batch.item.database.JdbcBatchItemWriter" scope="step"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="sql"> 
     <value> 
      <![CDATA[ 
       #{jobParameters['insert_JobQuery']} 
      ]]> 
     </value> 
    </property> 

    <property name="ItemPreparedStatementSetter"> 
     <bean class="com.my.sbatch.core.CustomPreparedStatement" /> 
    </property> 

Вот мой context.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"> 

<!-- stored job-meta in memory --> 
<!-- 
<bean id="jobRepository" 
    class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean"> 
    <property name="transactionManager" ref="transactionManager" /> 
</bean> 
--> 

<!-- stored job-meta in database --> 
<bean id="jobRepository" 
    class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="transactionManager" ref="transactionManager" /> 
    <property name="databaseType" value="mysql" /> 
</bean> 

<bean id="transactionManager" 
    class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" /> 

<bean id="jobLauncher" 
    class="org.springframework.batch.core.launch.support.SimpleJobLauncher"> 
    <property name="jobRepository" ref="jobRepository" /> 
</bean> 

В com.my.sbatch.core .CustomFieldSe tMapper, com.my.sbatch.core.CustomPreparedStatement классы Я использую отражения для полей отображения из File -> bean и Bean -> DB (подготовленный оператор).

Можете ли вы посоветовать мне какое-либо решение, почему это занимает слишком много времени

ответ

0

В этом примере, ваш пакетный процесс выполняется в одном потоке. Это может быть причиной, по которой это так долго. Я рекомендую использовать multhreading с компонентом TaskExecutor.

Например:

<batch:job id="file_to_db"> 
<batch:step id="step1"> 
    <batch:tasklet task-executor="taskExecutor" transaction-manager="transactionManager" start-limit="100"> 
     <batch:chunk reader="cvsFileItemReader" 
      writer="databaseItemWriter" commit-interval="10"> 
     </batch:chunk> 
    </batch:tasklet> 
</batch:step> 

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

Я рекомендую вам прочитать эту информацию, чтобы увидеть различные стратегии масштабируемости.

Дополнительная информация о масштабируемости here

Смежные вопросы