最近在做数据迁移,使用的sql语句没有添加where条件,导致客户端程序报oom错误。
是因为jdbc默认会把查询结果集全部返回到客户端导致oom错误。查找资料发现mysql的jdbc还支持以流的形式访问结果集。每当调用ResultSet的next()方法时返回部分数据。不会导致oom。设置如下
方法一:
preparStat= conn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
preparStat.setFetchSize(Integer.MIN_VALUE);
preparStat.setFetchDirection(ResultSet.FETCH_REVERSE);
方法二:
可以把Statement强转为mysql驱动包里面的Statement.mysql自己实现的statement有一个特有的方法为enableStreamingResults。调用这个方法也能够实现流式访问数据。
本文介绍了解决因查询结果集过大而导致客户端程序出现OOM错误的方法。通过使用流式查询,每次仅处理部分数据,有效避免了内存溢出问题。提供了两种实现方式:一是调整PreparedStatement设置;二是使用特定于MySQL的Statement方法。
721

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



