你好,java 向数据库添加大量数据时内存溢出 在不改变内存的情况下如何解决? 你当时是怎么解决的

 我来答
匿名用户
2013-02-22
展开全部
比如想将一个1000W数据的数据库表,导出到文件;此时,你要么进行分页,oracle当然用三层包装即可,mysql用limit,不过分页每次都会新的查询,而且随着翻页,会越来越慢,其实我们想拿到一个句柄,然后向下游动,编译一部分数据(如10000行)将写文件一次(写文件细节不多说了,这个是最基本的),需要注意的时候每次buffer的数据,在用outputstream写入的时候,最好flush一下,将缓冲区清空下;接下来,执行一个没有where条件的SQL,会不会将内存撑爆?是的,这个问题我们值得去思考下,通过API发现可以对SQL进行一些操作,例如,通过:PreparedStatement statement = connection.prepareStatement(sql),这是默认得到的预编译,还可以通过设置:PreparedStatement statement = connection.prepareStatement(sql , ResultSet.TYPE_FORWARD_ONLY , ResultSet.CONCUR_READ_ONLY);
来设置游标的方式,以至于游标不是将数据直接cache到本地内存,然后通过设置statement.setFetchSize(200);设置游标每次遍历的大小;OK,这个其实我用过,oracle用了和没用没区别,因为oracle的jdbc API默认就是不会将数据cache到java的内存中的,而mysql里头设置根本无效,我上面说了一堆废话,呵呵,我只是想说,java提供的标准API也未必有效,很多时候要看厂商的实现机制,还有这个设置是很多网上说有效的,但是这纯属抄袭;对于oracle上面说了不用关心,他本身就不是cache到内存,所以java内存不会导致什么问题,如果是mysql,首先必须使用5以上的版本,然后在连接参数上加上useCursorFetch=true这个参数,至于游标大小可以通过连接参数上加上:defaultFetchSize=1000来设置,例如:
jdbc:mysql://xxx.xxx.xxx.xxx:3306/abc?zeroDateTimeBehavior=convertToNull&useCursorFetch=true&defaultFetchSize=1000
上次被这个问题纠结了很久(mysql的数据老导致程序内存膨胀,并行2个直接系统就宕了),还去看了很多源码才发现奇迹竟然在这里,最后经过mysql文档的确认,然后进行测试,并行多个,而且数据量都是500W以上的,都不会导致内存膨胀,GC一切正常,这个问题终于完结了。

参考资料: xieyuoo_blog

bill_cool2008
2013-02-22 · TA获得超过495个赞
知道小有建树答主
回答量:871
采纳率:0%
帮助的人:197万
展开全部
2万条数据加载到内存中会出现内存溢出?有点假啊。。。你先试一下不插数据库会不会溢出,如果没有,解决办法:批量插入数据库,2000条一批吧,应该没问题。我当时20多万数据,耗时不到2秒。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
a11e90
2013-02-22 · 知道合伙人软件行家
a11e90
知道合伙人软件行家
采纳数:473 获赞数:1702
qq交流群:208779755 博客:https://my.oschina.net/haitaohu

向TA提问 私信TA
展开全部
分批次添加啊...你读取表的时候 是一条条读取的吧 这里应该用到循环了
你在循环1000次的时候或者100次的时候 提交一次
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友d12f6f3a1
2013-03-12 · TA获得超过2244个赞
知道小有建树答主
回答量:1.4万
采纳率:33%
帮助的人:2487万
展开全部
20,000个数据将被加载到内存中的内存溢出?有点假啊。 。 。尽量不要插在数据库中会溢出,如果没有量的解决方案:插入到数据库中,2000年的一批应该是没有问题的。我是20多万数据,消耗小于2秒。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
abcd880129
2013-02-22 · TA获得超过216个赞
知道小有建树答主
回答量:479
采纳率:0%
帮助的人:219万
展开全部
批量插入,当累积到一定量的数据时先刷新到数据库,然后再循环
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式