我有一个使用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将整个查询结果提取到内存中,那么它也会影响应用程序,因为它们都共享相同的物理内存。
答案 0 :(得分:6)
MySQL Connector / J驱动程序将获取所有行,除非获取大小设置为Integer.MIN_VALUE
(在这种情况下,它将一次获取一行AFAIK)。请参阅 ResultSet
下的MySQL Connector / J JDBC API Implementation Notes。
如果您希望内存使用成为问题(或实际上成为问题),您还可以使用LIMIT
子句实现分页(而不是使用setFetchSize(Integer.MIN_VALUE)
)。