mysql jdbc默认把select的所有结果全部取回,放到内存中,如果是要遍历很大的表,则可能把内存撑爆。
- 一种办法是:用limit,offset,但这样你会发现取数据的越来越慢,原因是设置了offset,mysql需要将读取位置移动到offset的位置,随着offset增大,取数据也越来越慢;
- 另外一种办法是:用数据流的方式取数据,这时需要设置:
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
这时候,mysql jdbc driver,一行行的取结果集。
但这种方式有几个限制:
- 只能从该连接只能取完所有结果集后才能运行其他SQL;
- resultset.getRow(),是不支持的,调用会抛unsupportedException;
本文介绍 MySQL JDBC 在处理大数据表时内存溢出的问题及解决方案,包括使用 limit 和 offset 的弊端,以及如何通过设置 ResultSet 类型为 TYPE_FORWARD_ONLY 和 CONCUR_READ_ONLY 实现数据流方式读取,提升效率。
2037

被折叠的 条评论
为什么被折叠?



