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的时候单查询就慢死了。
现在我在试按主键来分批处理,这个还在测试中

查看全部
wertyu1
wertyu1
2009/11/11 14:58
  • 数据库
  • 点赞
  • 收藏
  • 回答
    私信
满意答案
查看全部

0个回复