【问题标题】:Java Spring Batch how to read from postgres and then write data in stepJava Spring Batch如何从postgres读取然后逐步写入数据
【发布时间】:2018-07-13 00:27:34
【问题描述】:

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

【问题讨论】:

    标签: java spring postgresql spring-batch


    【解决方案1】:

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

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

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

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

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

    下一次 DB 读取发生在所有 1000 次先前读取已传递给处理器时。

    然后对于每一行,在别处发布该数据

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

    【讨论】:

    • org.springframework.batch.item.database.JdbcCursorItemReader 是另一种选择。如果是 postgres,你需要记住将连接设置为自动提交,否则没有光标:)
    • 是的,这确实是一个选项,我故意没有提到它,因为新手通常会尝试阅读整张桌子,然后因为大桌子而陷入 OOM。使用此阅读器,SQL 需要获取有限的行或需要指定获取大小(不保证会被接受)。
    【解决方案2】:

    在网上找不到任何示例

    你看过这里的官方样本吗: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)来读取页面中的数据,而不是在整个表上打开游标。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2016-01-18
      • 1970-01-01
      • 1970-01-01
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多