如何在多线程环境中使用JdbcTemplate?

Kiv*_*anc 2 java multithreading jdbc jdbctemplate spring-batch

我正在尝试将Spring JdbcTemplate与Spring的SimpleAsyncTaskExecutor一起使用,以便与单线程环境相比,可以在较短的时间内与DB进行并发连接并将整个数据插入到相关表中.

我正在使用以下代码,但它不会加快我的应用程序.

我能找到的唯一线索就是bean"campaignProductDBWriter"只构造了一次,而我希望创建10个单独的实例,因为我在tasklet中将"throttle-limit"设置为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>
Run Code Online (Sandbox Code Playgroud)

ska*_*man 6

这不是Spring配置的问题,也不是你使用的方式jdbcTemplate,这只是一个围绕JDBC API的瘦无状态包装器.

最明显的可能是您的瓶颈是您的数据库,而不是您的代码.完全可能对数据库运行多个并发操作并不比一次执行多个并发操作快.

这可能有几个原因,例如数据库锁定,或者只是缺少原始I/O性能.

在考虑使用多线程来提高性能时,您必须确定瓶颈在哪里.如果你的代码不是瓶颈,那么使它成为多线程并不会让事情变得更快.