2

Spring JdbcTemplate を Spring の SimpleAsyncTaskExecutor と一緒に使用して、DB への同時接続を確立し、シングル スレッド環境と比較して短い時間でデータ全体を関連テーブルに挿入できるようにしようとしています。

次のコードを使用していますが、アプリケーションの速度は向上しません。

私が見つけた唯一の手がかりは、タスクレットで「throttle-limit」を 10 に設定すると、10 個の個別のインスタンスが作成されることを期待しているのに対し、Bean「campaignProductDBWriter」は 1 回だけ構築されるという事実です。

私は何を間違っていますか?どんな助けや提案も大歓迎です。

よろしく、

<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>
4

2 に答える 2

6

jdbcTemplateこれは、Spring の構成や、JDBC API の単なる薄いステートレス ラッパーである の使用方法の問題ではありません。

最も明白な可能性は、ボトルネックがコードではなくデータベースであるということです。データベースに対して複数の同時操作を実行しても、一度に 1 つずつ実行するよりも速くない可能性は十分にあります。

これには、データベースのロック、または生の I/O パフォーマンスの不足など、いくつかの理由が考えられます。

マルチスレッドを使用してパフォーマンスを向上させることを検討する場合、ボトルネックがどこにあるかを確認する必要があります。コードがボトルネックでない場合、マルチスレッド化しても速度は向上しません。

于 2011-03-07T15:09:00.773 に答える
1

spring のコンテキストが初期化されると、コンテキストで宣言されたすべてのインスタンスが作成されます。 <bean id="campaignProductDBWriter" class="com.falcon.cc.job.step.CampaignProductWriter"> <property name="jdbcTemplate" ref="jdbcTemplateProduct" /> </bean>このコードは、春CampaignProductWriterにシングルトンとなるインスタンスを作成します(デフォルトではスコープはシングルトンであるため)。Bean の新しいインスタンスを作成するには、そのスコープをプロトタイプにする必要があります。

于 2016-10-26T16:05:38.747 に答える