使用场景:从数据库中读取1000万行数据[10列],并将其写入文件(csv格式)。
在JdbcCursorItemReader和JdbcPagingItemReader之间,应该选择哪种ItemReader实现?原因是什么?
在上述使用场景中,哪个实现性能更好(更快)?
如果采用单进程与多进程的方法,选择是否不同?
如果采用TaskExecutor进行多线程处理,哪一种方法更好、更简单?
使用场景:从数据库中读取1000万行数据[10列],并将其写入文件(csv格式)。
在JdbcCursorItemReader和JdbcPagingItemReader之间,应该选择哪种ItemReader实现?原因是什么?
在上述使用场景中,哪个实现性能更好(更快)?
如果采用单进程与多进程的方法,选择是否不同?
如果采用TaskExecutor进行多线程处理,哪一种方法更好、更简单?
为了做出选择,您应该对此进行分析。在普通的JDBC中,我会从以下方面开始:
ResultSet.TYPE_FORWARD_ONLY
和 ResultSet.CONCUR_READ_ONLY
准备语句。除非使用这两个选项,否则几个 JDBC 驱动程序会在客户端模拟游标,对于大型结果集,您不希望这样做,因为它可能导致 OutOfMemoryError
,因为 JDBC 驱动程序正在内存中缓冲整个数据集。通过使用这些选项,您增加了获得服务器端游标并逐位“流式传输”结果的机会,这是您对于大型结果集所需的。请注意,某些 JDBC 驱动程序始终在客户端模拟游标,因此此提示可能对您特定的 DBMS 无用。JdbcCursorItemReader
似乎涵盖了这两个方面,但正如之前所说,它们不能保证在所有DBMS中都提供最佳性能,因此我建议从那里开始,如果性能不足,则尝试JdbcPagingItemReader
。
我认为,除非您有非常严格的性能要求,否则使用JdbcCursorItemReader
进行简单处理不会很慢。如果您确实需要并行处理,使用JdbcPagingItemReader
可能更容易,但这两者的接口非常相似,因此我不会指望太多。
无论如何,进行性能分析。