首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在java中是否可以按主干加载mysql数据主干?

问在java中是否可以按主干加载mysql数据主干?
EN

Stack Overflow用户
提问于 2010-07-16 18:22:32
回答 2查看 727关注 0票数 0

目前,我正在使用java中的statement.executeQuery(qStr)从mysql中选择大量数据。不幸的是,java在异常java.lang.OutOfMemoryError: Java heap space的statement.executeQuery(qStr)语句中不断耗尽内存。我想知道是否有一种方法可以从mysql中流式加载数据。这样我就可以逐个处理所选的数据主干,以避免内存不足?

注意:我使用的是eclipse,这个post向我展示了如何增加堆内存,以便java在eclipse中使用。但是在我遵循了它的方法之后,我仍然遇到了同样的问题。

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-16 18:36:06

可以,您可以将语句上的FetchSize设置为Integer.MIN_VALUE,ResultSet也应该为TYPE_FORWARD_ONLY,尽管我认为这是默认设置。MySQL对此进行了特殊处理,并启用了ResultSet流,而不是将其全部读取到内存中,它是文档中的here

代码语言:javascript
复制
PreparedStatement stmt =  
 conn.prepareStatement(sql,ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
票数 1
EN

Stack Overflow用户

发布于 2010-07-16 18:42:09

默认情况下,ResultSets被完全检索并存储在内存中。如果你正在处理巨大的结果集,你的堆很快就会耗尽。您可以通过如下所示创建Statement实例来更改此行为:

代码语言:javascript
复制
 stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
          java.sql.ResultSet.CONCUR_READ_ONLY);
 stmt.setFetchSize(Integer.MIN_VALUE);

这将创建一个

fetch大小为Integer.MIN_VALUE的

只进、只读结果集充当驱动程序的信号,以逐行传输结果集。之后,将逐行检索使用该语句创建的任何结果集。

有关详细信息和注意事项,请参阅MySQL文档:http://dev.mysql.com/doc/refman/5.5/en/connector-j-reference-implementation-notes.html

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3263857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档