簡體   English   中英

如何在多線程環境中使用JdbcTemplate?

[英]how to use JdbcTemplate in a multithreaded environment?

我正在嘗試將Spring JdbcTemplate與Spring的SimpleAsyncTaskExecutor結合使用,以便與單線程環境相比,可以建立與數據庫的並發連接,並且可以在更短的時間內將整個數據插入相關表中。

我正在使用以下代碼,但是它不能加快我的應用程序的速度。

我能找到的唯一線索是,bean“ campaignProductDBWriter”僅構建一次,而我希望在Tasklet中將“ throttle-limit”設置為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>

這與Spring配置或jdbcTemplate使用方式jdbcTemplatejdbcTemplate只是JDBC API的薄jdbcTemplate狀態的包裝。

最明顯的可能性是瓶頸是數據庫,而不是代碼。 完全有可能對數據庫運行多個並發操作並不比一次執行一次要快。

可能有多種原因,例如數據庫鎖定或僅缺乏原始I / O性能。

當考慮使用多線程來提高性能時,必須確保瓶頸在哪里。 如果您的代碼不是瓶頸,那么使其成為多線程將不會使事情變得更快。

初始化spring的上下文時,它將創建在上下文中聲明的所有實例。 <bean id="campaignProductDBWriter" class="com.falcon.cc.job.step.CampaignProductWriter"> <property name="jdbcTemplate" ref="jdbcTemplateProduct" /> </bean>此代碼將導致在春季創建一個實例CampaignProductWriter ,該值將為單例(默認情況下,作用域為單例)。 為了擁有您的bean的新實例,它的范圍必須是原型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM