ItemReaderAdapter读取自定义DAO

时间:2014-02-26 16:52:29

标签: spring spring-mvc spring-batch spring-jdbc

我需要使用spring批处理来读取从数据库中检索到的现有逻辑,现有的目标对象方法在从数据库查询后返回对象列表。

所以我有一个任务要以块的形式阅读。当我从现有代码中看到列表大小时,我看到它大约是15000,但是在实现弹簧批处理时,我想要读取100块,而这不是通过ItemReaderAdapter发生的。

下面的代码片段可以让您了解我提到的问题。那么这可以从Spring Batch中获得。我注意到Delegating Job Sample Spring示例,但是那里的服务返回每个块上的对象而不是总列表对象。

请咨询

Job.xml

    <step id="firststep">
        <tasklet>
            <chunk reader="myreader" writer="mywriter"
                commit-interval="100" />
        </tasklet>
    </step>

        <job id="firstjob" incrementer="idIncrementer">
            <step id="step1" parent="firststep" />
        </job>

    <beans:bean id=" myreader "
        class="org.springframework.batch.item.adapter.ItemReaderAdapter">
        <beans:property name="targetObject" ref="readerService" />
        <beans:property name="targetMethod" value="getCustomer" />
    </beans:bean>   

    beans:bean id="readerService "
        class="com.sh.java.ReaderService">
    </beans:bean>

ReaderService.java

    Public ReaderService{

    Public List<CustomItem> getCustomer() throws Exception{
    /*code to get database instances
    *
     */
    List< CustomItem> customList =      dao.getCustomers(date);
    System.out.println(“Customer List Size: ”+customList.size()); //Here it is 15K
    return (List<CustomItem>) customList;
    }

    }

2 个答案:

答案 0 :(得分:0)

在所有之前:阅读15K列表&lt;&gt;对象可能会影响(负面)性能;检查您是否可以编写自定义SQL查询并使用JDBC / Hibernate游标项目阅读器。

使用ItemReaderAdapter(它不是为了读取一大块对象而设计的)是不可能的,但是你可以通过编写自定义ItemReader扩展{{3}来获得相同的结果继承ItemStream能力并覆盖抽象或无操作方法;尤其是:

  • doOpen()致电您的readerService.getCustomers()并在班级变量中保存List<>
  • doRead()中阅读下一项 - 来自List&lt;&gt;阅读doOpen() - 使用存储在ExecutionContext
  • 中的内置索引

答案 1 :(得分:0)

@Bellabax,

按照您的建议方式也会读取doOpen中的整个数据库记录,但是,从doOpen检索到的列表中,读取器会以块的形式读取它。请指教

<强> CustomerReader.java

public class CustomerReader extends
    AbstractItemCountingItemStreamItemReader<Customer>
{
List<Customer> customerList;

public CustomerReader ()
{
}

@Override
protected void doClose() throws Exception
{
    customerList.clear();
    setMaxItemCount(0);
    setCurrentItemCount(0);
}

@Override
protected void doOpen() throws Exception
{

 customList =  dao.getCustomers(date);
 System.out.println("Customer List Size: "+list.size()); //This still prints 15k 
  setMaxItemCount(list.size());
}

@Override
protected Customer doRead() throws Exception
{
     //Here reading 15K in chunks!
    Customer customer = customList.get(getCurrentItemCount() - 1);
    return customer;
}
}