【问题标题】:How to loop over a large SQL result set in Java or get X number of rows at a time如何在 Java 中遍历大型 SQL 结果集或一次获取 X 行
【发布时间】:2019-06-13 12:13:10
【问题描述】:

在我的 Spring Batch 程序中,我执行 SQL 查询,从返回的结果集中获取一些信息,然后将其打印到文件中。

返回的行太多,因此查询性能不佳。

SELECT * 
FROM CIF
WHERE status > 1

此示例查询返回 500,000 行。

我尝试一次选择前 5,000 行:

SELECT TOP 5000
FROM CIF
WHERE status > 1

这里的问题是,如果我循环这个,我每次都会得到相同的 5,000 行。我想不出一种方法来循环并获取 5,000 行,将我需要的信息打印到文件中,然后获取接下来的 5,000 行。有什么想法吗?

【问题讨论】:

  • Define bad performance 也许你应该首先解决为什么获得 500.000 行表现不好。一种选择是查询所有 500.000,然后在循环时每 5000 行写入文件。
  • 我很快就获得了 500,000 行,但无法在 Java 中将这么多行存储到内存中,它只是无法处理那么大的对象。我必须一次查询数据库 5,000 行,我无法获取所有 500,000 行并循环遍历它。
  • 一次获取 5000 行是危险的,如果在执行此操作时行数发生变化怎么办? 500.000 并没有那么大,也许你应该找出它为什么表现这么差

标签: java sql-server spring spring-batch


【解决方案1】:

我不确定 spring 批处理,但就您使用 sql 而言,您应该能够使用 "limit" 参数。

【讨论】:

  • 那行不通。每次通过时,我需要获得 500,000 条记录中的 5,000 条。如果我只是将 LIMIT 设置为 5,000,那么每次执行查询时我都会得到相同的 5,000 行。
  • 在我看来,500.000 条记录并不多。一张唱片有多大?
  • 你看到limit提供了一个offset参数吗?
  • 是的,我看到了 offset 参数,但是我又一次如何制作查询来偏移 X 行以通过每 500,000 行?如果我说 SELECT * FROM CIF ORDER BY STATUS OFFSET 5,000 ROWS 它不会返回每 5,000 行
  • 一个记录非常大。在我们的应用程序中,我们的最大返回数为 15,001 行。如果返回更多行,我们将退出程序。
【解决方案2】:

Spring Batch 使用我们的 JdbcPagingItemReader 本地执行此操作。您还可以使用JdbcCursorItemReader 流式传输记录(而不是一次全部返回)。分页处理为您生成限制查询。您可以在此处的文档中阅读有关 JdbcPagingItemReader 的更多信息:https://docs.spring.io/spring-batch/4.0.x/reference/html/readersAndWriters.html#pagingItemReaders

【讨论】:

    猜你喜欢
    • 2011-11-30
    • 2012-02-19
    • 2012-04-15
    • 2019-05-18
    • 2023-04-05
    • 2020-07-12
    • 2012-06-05
    • 1970-01-01
    相关资源
    最近更新 更多