wertyu1 2009-11-11 14:58
浏览 639
已采纳

JDBC遍历一个很大的数据表的问题

我要遍历一个有1500w条记录的数据表,对其中的每条记录进行修改,然后再存回数据库中去。
下面是我写的代码,一运行就会抛内存溢出。(省略部分与问题无关代码)
[code="java"]
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/db?useCursorFetch=true", "user","pwd");
stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
stmt.setFetchSize(5000);
rs = stmt.executeQuery("select * from table");
while (rs.next())
{
// 处理记录(处理过程只能用程序写)
...
// 更新记录
rs.updateString(col_index, "处理后的值");
...
rs.updateRow();
}
[/code]
下面是抛出的异常,在stmt.executeQuery()那一句就抛出了:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.mysql.jdbc.MysqlIO.nextRowFast(MysqlIO.java:1574)
at com.mysql.jdbc.MysqlIO.nextRow(MysqlIO.java:1398)
at com.mysql.jdbc.MysqlIO.readSingleRowSet(MysqlIO.java:2816)
at com.mysql.jdbc.MysqlIO.getResultSet(MysqlIO.java:467)
at com.mysql.jdbc.MysqlIO.readResultsForQueryOrUpdate(MysqlIO.java:2510)
at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:1746)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2135)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2536)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2465)
at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1383)
at com.wawame.geocoding.Test.main(Test.java:37)

最后说明:这个过程必须要用程序来写。

还请各位大能帮我看一下。
先谢谢了!
[b]问题补充:[/b]
感谢各位的回答,分页处理一开始是很快的,但是到后面会很慢,比如limit 10000000, 10000的时候单查询就慢死了。
现在我在试按主键来分批处理,这个还在测试中

  • 写回答

6条回答 默认 最新

  • lijiepeng 2009-11-11 17:59
    关注

    1500W条数据全部载入内存,数据量太大了。
    如果一条数据只有代理主键字段,定义成int类型.那么就是57M多.你可以大概算下一条数据量是int数据量的几倍.
    解决办法:内存溢出,增大内存是最直接的办法.
    另一种办法是,重复利用内存,分页查询出数据,设定一页的条数,查询一页,处理一页,处理完了然后再查询,重复这个过程,直至1500W条完全处理结束.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
  • ¥15 怎么配置广告联盟瀑布流
  • ¥15 Rstudio 保存代码闪退
  • ¥20 win系统的PYQT程序生成的数据如何放入云服务器阿里云window版?
  • ¥50 invest生境质量模块