JDBC使用MySQL选择批处理/获取大小

我有一个使用JDBC的Java应用程序,它每天在我的服务器上运行一次,并与同样在同一服务器上运行的MySQL数据库(v5.5)进行交互。 该应用程序正在查询并迭代表中的所有行。

该表目前相当小(约5000行),但将继续无限增长。 我的服务器内存是有限的,我不喜欢应用程序的内存消耗不确定的想法。

如果我在运行查询之前使用statement.setFetchSize(n) ,那么我不清楚这里发生了什么。 例如,如果我使用类似的东西:

 PreparedStatement query = db.prepareStatement("SELECT x, y FROM z"); query.setFetchSize(n); ResultSet result = query.executeQuery(); while ( result.next() ){ ... } 

这是如何适当控制潜在的大型选择查询? 这里发生了什么事? 如果n是1000,那么MySQL一次只能将1000行拉入内存(知道它停在哪里),然后每次需要时抓取下一行(或多行)?

编辑:
我现在很清楚,设置提取大小对我没用。 请记住,我的应用程序和MySQL服务器都在同一台机器上运行。 如果MySQL将整个查询结果提取到内存中,那么它也会影响应用程序,因为它们共享相同的物理内存。

MySQL Connector / J驱动程序将获取所有行,除非获取大小设置为Integer.MIN_VALUE (在这种情况下,它将一次获取一行AFAIK)。 请参阅ResultSet下的MySQL Connector / J JDBC API实现说明 。

如果您希望内存使用成为问题(或实际上它成为问题),您还可以使用LIMIT子句实现分页(而不是使用setFetchSize(Integer.MIN_VALUE) )。