RTF*_*RTF 4 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() ){
...
}
Run Code Online (Sandbox Code Playgroud)
这是如何适当控制潜在的大型选择查询?这里发生了什么事?如果n是1000,那么MySQL一次只能将1000行拉入内存(知道它离开的位置),然后每次需要时抓取下一行(或多行)吗?
编辑:
我现在很清楚,设置获取大小对我没用.请记住,我的应用程序和MySQL服务器都在同一台机器上运行.如果MySQL将整个查询结果提取到内存中,那么它也会影响应用程序,因为它们共享相同的物理内存.
MySQL Connector/J驱动程序将获取所有行,除非将获取大小设置为Integer.MIN_VALUE(在这种情况下,它将一次获取一行AFAIK).见MySQL的连接器/ J JDBC API实现说明下ResultSet.
如果您希望内存使用成为问题(或实际上成为问题),您还可以使用LIMIT子句(而不是使用setFetchSize(Integer.MIN_VALUE))实现分页.
| 归档时间: |
|
| 查看次数: |
3815 次 |
| 最近记录: |