Mysql遍历⼤表(Mysql⼤量数据读取内存溢出的解决⽅法)mysql jdbc默认把select的所有结果全部取回,放到内存中,如果是要遍历很⼤的表,则可能把内存撑爆。
⼀种办法是:⽤limit,offset,但这样你会发现取数据的越来越慢,原因是设置了offset,mysql需要将读取位置移动到offset的位置,随着offset增⼤,取数据也越来越慢;
另外⼀种办法是:⽤数据流的⽅式取数据,这时需要设置:
Java代码
1. stmt = ateStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
resultset 遍历
2.              java.sql.ResultSet.CONCUR_READ_ONLY);
3. stmt.setFetchSize(Integer.MIN_VALUE);
这时候,mysql jdbc driver,⼀⾏⾏的取结果集。
但这种⽅式有⼏个限制:
1. 只能从该连接只能取完所有结果集后才能运⾏其他SQL;
2. Row(),是不⽀持的,调⽤会抛unsupportedException;
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
我在使⽤该⽅法的时候出现过类似以下错误:
Caused by:  .sql.SQLException: Streaming result set com. .jdbc.RowDataDynamic@5bdbda4f is still active.No statements may be issued when any streaming result sets are open and in use on a given connection.Ensure that you have called
.close() on any active streaming result sets before attempting more queries.
原因就是违反了第⼀个限制,所以如果查询的数据集没有读取完,其他的sql操作都要另起⼀个connection。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。