Spring 批次中的 PagingItemReader 与 CursorItemReader
PagingItemReader vs CursorItemReader in Spring batch
我有一个包含多个步骤的 spring 批处理,一些是顺序的,一些是并行的。其中一些步骤涉及获取数百万行,并且查询具有多个连接和左连接。我尝试使用 JdbcPagingItemReader 但 order by 子句只是挂起查询。即使在等待 30 分钟后,我也没有得到结果。所以我切换到 JdbcCursorItemReader。
这种方法好吗?我知道 JdbcCursorItemReader 一次获取所有数据并根据提交间隔将其写出。是否有任何选项可以指定 reader 一次获取 50000 条记录,这样我的应用程序和系统就不会超载?
迈克尔,感谢您的回复。我有 22 个自定义项 reader,它们是从 jdbcCursorItemReader 扩展而来的。如果有多个线程,Spring 批处理将如何处理结果集?在这种情况下,是否也有可能从同一个结果集中读取多个线程?
JdbcCursorItemReader
能够配置 fetchSize(每个请求从数据库返回多少条记录),但这取决于您的数据库及其配置。例如,对于大多数数据库,您可以配置获取大小并且它是有效的。但是,MySql 要求您将获取端设置为 Integer.MIN_VALUE
以便流式传输结果。 Sqlite 是另一个有特殊要求的。
也就是说,重要的是要知道 JdbcCursorItemReader
不是线程安全的(多个线程将从同一个 ResultSet
读取)。
我个人会提倡调整您的查询,但假设上述条件,您应该可以使用 JdbcCursorItemReader
没问题。
我有一个包含多个步骤的 spring 批处理,一些是顺序的,一些是并行的。其中一些步骤涉及获取数百万行,并且查询具有多个连接和左连接。我尝试使用 JdbcPagingItemReader 但 order by 子句只是挂起查询。即使在等待 30 分钟后,我也没有得到结果。所以我切换到 JdbcCursorItemReader。 这种方法好吗?我知道 JdbcCursorItemReader 一次获取所有数据并根据提交间隔将其写出。是否有任何选项可以指定 reader 一次获取 50000 条记录,这样我的应用程序和系统就不会超载?
迈克尔,感谢您的回复。我有 22 个自定义项 reader,它们是从 jdbcCursorItemReader 扩展而来的。如果有多个线程,Spring 批处理将如何处理结果集?在这种情况下,是否也有可能从同一个结果集中读取多个线程?
JdbcCursorItemReader
能够配置 fetchSize(每个请求从数据库返回多少条记录),但这取决于您的数据库及其配置。例如,对于大多数数据库,您可以配置获取大小并且它是有效的。但是,MySql 要求您将获取端设置为 Integer.MIN_VALUE
以便流式传输结果。 Sqlite 是另一个有特殊要求的。
也就是说,重要的是要知道 JdbcCursorItemReader
不是线程安全的(多个线程将从同一个 ResultSet
读取)。
我个人会提倡调整您的查询,但假设上述条件,您应该可以使用 JdbcCursorItemReader
没问题。