2016-07-09 79 views
0

我已經創建了一個存儲過程讀取器,它返回一個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> 
+0

請發佈您的'ItemReader'中的代碼。我的期望是你在'ItemReader'中持有對ResultSet的單引用,因爲根據規範,ResultSet不是線程安全的。 –

+0

我已添加我的Itemreader。 –

回答

0

StoredProcedureItemReader不是線程安全的,由於我們在它引用單個ResultSet的事實。處理線程安全莊園的唯一方法是編寫自己的ItemReader實現,或者以我們的方式處理同步。

+0

我認爲寫我自己的讀者將是一個好主意。你也可以指導我如何包裝你的處理適當的同步適合我的情況? –

+0

我認爲'JdbcPagingItemReader'可以被認爲是線程安全的替代方案(saveState = false)。但是,我不確定它查詢數據庫的次數。 – nahab

+0

它每頁查詢一次。 –