2016-07-09 15 views
0

refカーソルを返すストアドプロシージャーリーダーを作成しました。これをoracleテーブルのrefカーソルから取得します。マルチスレッドでバッチ処理アプリケーションを変換する格納されているproc.Currentlyの参照カーソルから受け取った別のレコードで動作します。私はマルチスレッドでデータを正しく挿入していないバッチ処理を行っています。私はマルチスレッドで変換しようとすると、スレッドといくつかではない。マルチスレッドのSpringバッチでエラーが発生しました

ここに私の仕事の定義とtaskExecutor.Some回 "私はエラーが"予期しないカーソル位置の変更 "と言っています。すべてのヘルプは本当に感謝します。

<!-- TestUser Job definition --> 
<job id="TestUserJob" xmlns="http://www.springframework.org/schema/batch" 
    restartable=" true " incrementer="jobParametersIncrementer"> 
    <step id="step1" allow-start-if-complete="true"> 
     <tasklet task-executor="taskExecutor" throttle-limit="5"> 
      <chunk reader="testUserItemReader" writer="testUserItemWriter" 
       commit-interval="1" /> 
     </tasklet> 
    </step> 
    <!-- Add step2 and so on HERE --> 
</job> 
<!-- Task executer definition --> 
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> 
    <property name="corePoolSize" value="3" /> 
    <property name="maxPoolSize" value="4" /> <!-- put in variable like ${variable-name} --> 
</bean> 
<bean id="testUserItemReader" 
    class="org.springframework.batch.item.database.StoredProcedureItemReader"> 
    <property name="dataSource" ref="oracle_dataSource" /> 
    <property name="procedureName" value="get_user_func_no_arg" /> 
    <property name="parameters"> 
     <list> 
      <bean class="org.springframework.jdbc.core.SqlParameter"> 
       <constructor-arg index="0" value="p_id_min" /> 
       <constructor-arg index="1"> 
        <util:constant static-field="java.sql.Types.INTEGER" /> 
       </constructor-arg> 
      </bean> 
      <bean class="org.springframework.jdbc.core.SqlOutParameter"> 
       <constructor-arg index="0" value="p_recordset" /> 
       <constructor-arg index="1"> 
        <util:constant static-field="oracle.jdbc.OracleTypes.CURSOR" /> 
       </constructor-arg> 
      </bean> 
     </list> 
    </property> 
    <property name="refCursorPosition" value="2" /> 
    <property name="rowMapper"> 
     <bean class="com.model.testUser.TestUserRowMapper" /> 
    </property> 
    <property name="PreparedStatementSetter" ref="psTestUserSetter" /> 
</bean> 
+0

「ItemReader」からコードを投稿してください。私の期待は、あなたが 'ItemReader'の' ResultSet'への単一の参照を保持しているということです。これは動作しません。なぜなら、仕様に従って、 'ResultSet'はスレッドセーフではないからです。 –

+0

私はItemreaderを追加しました。 –

答えて

0

StoredProcedureItemReaderが原因我々はそれに単一ResultSetを参照しているという事実にはスレッドセーフではありません。スレッドセーフなマナーでこれを処理する唯一の方法は、独自のItemReader実装を記述するか、同期を処理する方法で私たちをラップすることです。

+0

自分の読者を書くことは良いアイデアだと思います。私のシナリオでは、同期を正しく処理する方法をどのようにラップすることができますか? –

+0

私は 'JdbcPagingItemReader'はスレッドセーフな代替(saveState = false)と考えることができると思います。しかし、私はそれが何回クエリデータベースを確認するのか分かりません。 – nahab

+0

ページごとに1回クエリを実行します。 –

関連する問題