我有一个包含多个步骤的弹簧批次,一些顺序和一些并行。其中一些步骤涉及获取数百万行,并且查询具有多个连接和左连接。我尝试使用JdbcPagingItemReader,但order by子句只是挂起查询。即使经过30分钟的等待,我也无法获得结果。所以我切换到了JdbcCursorItemReader。 那方法很好吗?我知道JdbcCursorItemReader一次获取所有数据并根据提交间隔将其写出。是否有任何选项指定读者一次获取50000条记录,以便我的应用程序和系统不会超载?
谢谢你的答复,迈克尔。我有22个自定义项目阅读器,它们是从jdbcCursorItemReader扩展而来的。如果有多个线程,Spring批处理将如何处理结果集?在这种情况下,是否有可能从同一结果集中读取多个线程?答案 0 :(得分:1)
JdbcCursorItemReader
能够配置fetchSize(每个请求从db返回的记录数),但这取决于您的数据库及其配置。例如,大多数数据库都可以配置提取大小,并且很荣幸。但是,MySql要求您将获取端设置为Integer.MIN_VALUE
以便传输结果。 Sqlite是另一个有特殊要求的。
话虽如此,重要的是要知道JdbcCursorItemReader
不是线程安全的(多个线程将从同一个ResultSet
读取)。
我个人主张调整您的查询,但假设上述条件,您应该可以使用JdbcCursorItemReader
罚款。