【发布时间】:2018-03-01 01:10:19
【问题描述】:
我正在使用带有 Spring Data JPA 和 Spring Batch 的 Spring Boot 1.5.7。我使用JpaPagingItemReader<T> 读取实体并使用JpaItemWriter<T> 写入它们。我的目标是从某个数据库表中读取数据,将它们转换为不同的格式并将它们写回不同的表(我读取原始 json 字符串,将它们反序列化并将它们插入到它们的特定表中)。
我不打算在处理完读取的数据后删除它们,而是只想将它们标记为已处理。问题是,JpaPagingItemReader 处理读取是否良好,如果我对以下内容进行查询:
@Bean
public ItemReader<RdJsonStore> reader(){
JpaPagingItemReader<RdJsonStore> reader = new JpaPagingItemReader<>();
reader.setEntityManagerFactory(entityManagerFactory);
reader.setQueryString("select e from RdJsonStore e "+
"where e.jsonStoreProcessedPointer is null");
reader.setPageSize(rawDataProperties.getBatchProcessingSize());
return reader;
}
所以它只有在没有指向它的指针时才会读取。我会在处理一个条目后插入一个指针(分批,比如我处理 1000 个条目并将它们的所有 id 发布到指针表中)。
如果我像这样更改运行时返回的数据,ItemWriter(和 JPA 的)能否处理读取的数据(它尝试查询的条目每批都会减少)?
如果指针解决方案不适用,我应该如何设计 DB-to-DB 批处理作业?
我的源表如下所示:
【问题讨论】:
-
不,它不能,底层数据发生变化,对于每个页面重新执行查询,您将开始丢失数据。
-
@M.Deinum 这就是我的想法:(
标签: java hibernate spring-boot spring-data-jpa spring-batch