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

时间:2014-06-07 14:32:44

标签: java mysql sql jdbc

我有一个使用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将整个查询结果提取到内存中,那么它也会影响应用程序,因为它们都共享相同的物理内存。

1 个答案:

答案 0 :(得分:6)

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

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