Java Spring Batch如何从postgres读取数据,然后一步步写入数据

标签 java spring postgresql spring-batch

无法在网上找到任何示例,但我想做的基本上是使用 Java Spring Batch 读取 postgres 中的整个表,然后对于每一行,在其他地方发布该数据。我读过https://spring.io/guides/gs/batch-processing/但不知道如何做到这一点。我还想留出数据检索的空间,这样我的数据库就不会被阻塞。有很多从 csv 文件读取的示例,但找不到如何从存储库读取。

最佳答案

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

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

RepositoryItemReadersetPageSize(int pageSize)方法和类似的方法在JdbcPagingItemReader中有也。表格中必须有一列可以进行排序以实现分页。

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

这些读取器将读取一个页面一次,将其保留在内存中,并处理单个项目,直到达到 block 大小,然后提交。在一页完全完成之前,不会发生下一次数据库读取。一般来说,为了获得最佳性能, block 大小需要比页面大小小几倍,例如阅读器页面大小 - 1000 & block 大小 = 100,因此 1000 个项目将被读取一次并以 100 - 100 个项目的 block 形式提交。

当所有 1000 个先前读取都已传递到处理器时,就会发生下一次数据库读取。

then for each row, publish that data elsewhere

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

关于Java Spring Batch如何从postgres读取数据,然后一步步写入数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51316162/

相关文章:

java - 当复合组件放置在 PrimeFaces p :dialog 内时,不会调用 encodeAll 方法

java - 批处理 - 如何等待具有特定名称的进程开始和完成?

java - NullPointEreException 与 Hibernate 4 和 Spring 3.0.5 集成

sql - PostgreSQL:递增否则插入

java - toast 出现两次

java - 使用Tabactivity Result代码获取0,返回Intent数据为null

java - 尝试访问部署在 K8s/Argocd 服务器上的 Spring 后端时出现 "required audience is missing"

java - 如何更改 Java Spring API 中的默认 Swagger 2 api 文档名称

ruby - 在 PostgreSQL 中按指定列分组

sql - postgres/甲骨文 : get last non-null value within group