Java Spring Batch如何从Postgres中读取然后在步骤中写入数据

时间:2018-07-13 00:27:35

标签: java spring postgresql spring-batch

无法在线找到任何示例,但是我想做的基本上是使用Java Spring Batch在postgres中读取整个表,然后针对每一行,将该数据发布到其他地方。我读了https://spring.io/guides/gs/batch-processing/,但不知道该怎么做。我还想扩展数据检索的空间,以免数据库被阻塞。有很多示例从csv文件读取,但是找不到从存储库中读取数据的方法。

2 个答案:

答案 0 :(得分:1)

要阅读该表,您需要使用Spring Batch提供的阅读器之一-使用org.springframework.batch.item.data.RepositoryItemReaderorg.springframework.batch.item.database.JdbcPagingItemReader

两个阅读器都实现分页,因此您的数据库读取是逐页进行的,而不是整个表都一次被读取。

RepositoryItemReader具有setPageSize(int pageSize)方法,JdbcPagingItemReader中也有类似方法。表中必须有一列可以对其进行排序以实现分页。

尝试使用这两个阅读器查找代码示例。

这些读者将阅读一次页面,将其保存在内存中,并处理单个项目直到达到块大小然后进行提交。在一页完全完成之前,不会进行下一个DB读取。通常,为了获得最佳性能,块大小需要比页面大小小几倍。读取器页面大小-1000&块大小= 100,因此将读取1000个项目,并以100-100个项目的块提交。

下一次DB读取发生在1000次以前的读取全部传递给处理器时。

  

然后将每一行的数据发布到其他地方

要完成上述操作,您必须将块大小设置为1,然后在writer中,您可以做任何您想做的事,这样就可以为每个项目提交事务。

答案 1 :(得分:0)

  

找不到在线示例

您在这里看到过官方示例:https://github.com/spring-projects/spring-batch/tree/master/spring-batch-samples吗?

有许多示例说明了如何从数据库读取数据:

  

我想做的基本上是使用Java Spring Batch在postgres中读取整个表,然后对于每一行,将该数据发布到其他地方。

先前示例中的所有作业都至少具有一个步骤,该步骤从数据库读取数据并将其写入其他位置。

  

我也想扩大数据检索的空间,以免数据库被阻塞

我建议使用其中一个分页项读取器(请参阅https://docs.spring.io/spring-batch/4.0.x/reference/html/readersAndWriters.html#pagingItemReaders)读取页面中的数据,而不要在整个表上打开游标。