我已經創建了一個存儲過程讀取器,它返回一個ref cursor,並且我希望將ref cursor中的數據存儲在oracle table中。我想將我的批處理應用程序轉換爲多線程,其中每個線程工作在從存儲過程的ref cursor接收到的不同記錄上。目前,我的批處理過程沒有使用多線程工作,它在表格中正確地插入數據。當我嘗試在多線程中轉換時,我面臨奇怪的情況,通過線程和一些不是。多線程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。 –