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