在JDBC中,该setFetchSize(int)方法对于JVM中的性能和内存管理非常重要,因为它控制从JVM到数据库的网络调用的数量,以及相应的用于ResultSet处理的RAM量。
本质上,如果调用setFetchSize(10)并且驱动程序忽略它,则可能只有两个选项:尝试使用不同的JDBC驱动程序来支持fetch-size提示。
查看Connection上的驱动程序特定属性(创建Connection实例时的URL和/或属性映射)。
RESULT-SET是响应查询而在DB上编组的行数。ROW-SET是从JVM到DB的每次调用从RESULT-SET中取出的行块。处理所需的这些调用数和生成的RAM取决于fetch-size设置。
因此,如果RESULT-SET有100行且fetch-size为10,那么将有10次网络调用来检索所有数据,在任何给定时间使用大约10 * {row-content-size} RAM。
默认的fetch-size是10,相当小。在发布的情况下,似乎驱动程序忽略了fetch-size设置,在一次调用中检索所有数据(大RAM要求,最佳最小网络调用)。
下面发生的ResultSet.next()是它实际上并没有从RESULT-SET一次获取一行。它从(本地)ROW-SET中获取它,并在本地客户端上耗尽时从服务器获取下一个ROW-SET(不可见)。
所有这一切都取决于驱动程序,因为设置只是一个“提示”,但实际上我发现这是它如何适用于许多驱动程序和数据库(在许多版本的Oracle,DB2和MySQL中验证)。