要求:我必须扫描整个表并更新每条记录,周期。
正如其他人所建议的那样,我应该创建一个与原始表具有相同架构的临时表,并对更新的值进行插入,然后重命名表而不是更新原始表。
这个想法是这样的:
ResultSet row = select * from old_table;
While row.next
do something to update values in this row
insert updated values in to a identical table (different name of course)
endWhile
这里的问题是我使用的是 Java JDBC,我必须处理 ResultSet 对象。那么有没有办法防止“ResultSet row = select * from old_table”产生内存不足异常?
一个潜在的解决方案是分页,但这意味着我必须使用 ORDER BY 和 LIMIT,这在 300 万行的表上可能非常慢。
ResultSet 是否有一些技巧,比如指定一些标志,如 FOWARD_ONLY | NON-SCROLLABLE 等。或者 Mysql 服务器是否有一些配置可以做一些聪明的事情,比如 mysql 知道我正在做全表扫描,所以只是按顺序为我返回记录,但不是一次全部返回。
欢迎任何建议
[更新] 似乎 MySQL 连接器/J 具有名为的配置参数useCursorFetch
,如果设置为 truestatement.setFetchSize(1000)
则将起作用。不确定这是否是最终解决方案。