2013-04-23 70 views
2

我試圖從循環中讀取數據庫中的一些記錄,然後對記錄進行一些計算(更新一個稱爲總計的字段)。從Spring批處理數據庫中讀取記錄

但我是新的春季批次,所以請任何人都可以提供一些提示。

+0

你試圖更新檢索到的所有記錄上的'total'字段嗎?或只有一個簡要記錄? – 2013-04-23 13:10:32

+0

我試圖更新所有記錄。沒有總結 – user1744446 2013-04-23 13:54:22

回答

6

這聽起來像塊圖案會解決的問題。您可以使用現有的Spring Batch組件來重新讀取數據庫,編寫自己的處理器,然後傳回給Spring Batch組件進行存儲。

說用例是這樣的; - 讀取記錄 - record.setTotalColumn(record.getColumn2()+ record.getColumn3()) - 更新

這種配置可能是這樣

<batch:job id="recordProcessor"> 
    <batch:step id="recordProcessor.step1"> 
    <batch:tasklet> 
     <batch:chunk reader="jdbcReader" processor="calculator" writer="jdbcWriter" commit-interval="10"/> 
     </batch:tasklet> 
    </batch:step> 
</batch:job> 

<bean id="jdbcReader" class="org.springframework.batch.item.database.JdbcCursorItemReader"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="sql" value="select idColumn,column1,column2,totalColumn from my_table"/> 
    <property name="rowMapper" ref="myRowMapper"/> 
</bean> 

<bean id="jdbcWriter" class="org.springframework.batch.item.database.JdbcBatchItemWriter"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="sql" value="update my_table set totalColumn = :value where idColumn = :id"/> 
</bean> 

<bean id="calculator" class="de.incompleteco.spring.batch.step.item.CalculationProcessor"/> 

這意味着你唯一必須從頭開始寫「計算器處理器」,它可能是這樣的;

package de.incompleteco.spring.batch.step.item; 

import org.springframework.batch.item.ItemProcessor; 

public class CalculationProcessor implements ItemProcessor<MyObject, MyObject> { 

    @Override 
    public MyObject process(MyObject item) throws Exception { 
     //do the math 
     item.setTotalColumn(item.getColumn1() + item.getColumn2()); 
     //return 
     return item; 
    } 

} 
+0

非常感謝你。最後一件事,我必須做什麼關於springContext.xml? – user1744446 2013-04-23 14:17:10

+0

上面的批處理作業xml會在您的springContext.xml中與批處理的其他最小設置 – 2013-04-23 14:26:00

+0

一起使用我有一個類似的場景,每個作業實例必須讀取/更新1000行中的100行(即10個作業執行) 。 'sql'參數需要動態提供?怎麼樣? – Saad 2014-01-27 16:46:10

相關問題