Как использовать JdbcTemplate в многопоточной среде? - PullRequest
2 голосов
/ 07 марта 2011

Я пытаюсь использовать Spring JdbcTemplate с SpringAs SimpleAsyncTaskExecutor, чтобы параллельные соединения с БД может быть сделано, и все данные могут быть вставлены в связанную таблицу за меньшее время по сравнению с однопоточной средой.

Я использую следующий код, но он не ускоряет мое приложение.

Единственная подсказка, которую я смог найти, это то, что bean-компонент "aignProductDBWriter "создается только один раз, тогда как я ожидаю создания 10 отдельных экземпляров. как я установил «предел дроссельной заслонки» на 10 в тасклете.

Что я делаю не так? Буду очень признателен за любую помощь или предложения.

С уважением,

<bean id="dataSourceProduct"
  class="org.springframework.jdbc.datasource.DriverManagerDataSource"
  p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url.product}"
  p:username="${jdbc.username.product}" p:password="${jdbc.password.product}" 
/>

<bean id="jdbcTemplateProduct" class="org.springframework.jdbc.core.JdbcTemplate">
  <property name="dataSource" ref="dataSourceProduct" />
</bean>

<bean id="simpleTaskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor" >
  <property name="concurrencyLimit" value="-1" />
</bean>

<batch:job id="sampleJob" restartable="true"  incrementer="dynamicJobParameters">             
  <batch:step id="mapMZList">
    <batch:tasklet allow-start-if-complete="true" task-executor="simpleTaskExecutor" throttle-limit="10">                     
      <batch:chunk reader="campaignProductItemReader" processor="campaignProductProcessor" writer="campaignProductDBWriter" commit-interval="5000"/>        
    </batch:tasklet>
  </batch:step>                 
</batch:job>

<bean id="campaignProductDBWriter" class="com.falcon.cc.job.step.CampaignProductWriter">
  <property name="jdbcTemplate" ref="jdbcTemplateProduct" />
</bean>


<bean id="campaignProductItemReader" class="com.falcon.cc.job.step.FlatFileSynchronizedItemReader" scope="step">    
  <property name="resource" value="file:#{jobParameters['input.TEST_FILE.path']}"/>

  <property name="lineMapper">
    <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">        
      <property name="lineTokenizer">       
        <bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
          <property name="delimiter" value=";"/>            
          <property name="names" value="approvalStatus,validFrom,validTo"/>
        </bean>
      </property>
      <property name="fieldSetMapper">
        <bean class="com.falcon.cc.mapper.CampaignProductFieldSetMapper" />
      </property>
    </bean>
  </property>
</bean>

Ответы [ 2 ]

6 голосов
/ 07 марта 2011

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

Наиболее очевидная вероятность состоит в том, что вашузким местом является ваша база данных, а не ваш код.Вполне возможно, что выполнение нескольких одновременных операций с базой данных не быстрее, чем выполнение их по одной за раз.

Для этого может быть несколько причин, таких как блокировка базы данных или просто недостаточная производительность ввода-вывода.

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

1 голос
/ 26 октября 2016

Когда контекст Spring инициализируется, он создает все экземпляры, объявленные в контексте. <bean id="campaignProductDBWriter" class="com.falcon.cc.job.step.CampaignProductWriter"> <property name="jdbcTemplate" ref="jdbcTemplateProduct" /> </bean> этот код приведет к созданию весной экземпляра CampaignProductWriter, который будет синглтоном (так как по умолчанию область действия - синглтон) Чтобы иметь новый экземпляр вашего компонента, его область должна быть прототипом.

...