JDBC中的setFetchSize()

来源:互联网 发布:未来大数据对中国影响 编辑:程序博客网 时间:2024/05/18 01:56
转载自:http://blog.csdn.net/seven_3306/article/details/9303879

在使用MySQL的JDBC时,如果查询结果集过大,使用一次查询,可能会出现Java.lang.OutOfMemoryError: Java heap space问题,因为DB服务器端一次将查询到的结果集全部发送到Java端保存在内存中而造成OOM。

MySQL JDBC需要一条SQL从数据库读取大量数据,而不发生JVM OOM,可以采用以下方法之一:
    1、当statement设置以下属性时,采用的是流数据接收方式,每次只从服务器接收部份数据,直到所有数据处理完毕,不会发生JVM OOM。
setResultSetType(ResultSet.TYPE_FORWARD_ONLY);setFetchSize(Integer.MIN_VALUE); 
    2、调用statement的enableStreamingResults方法,实际上enableStreamingResults方法内部封装的就是第1种方式。
    3、设置连接属性useCursorFetch=true (5.0版驱动开始支持),statement以TYPE_FORWARD_ONLY打开,再设置fetch size参数,表示采用服务器端游标,每次从服务器取fetch_size条数据。

故采用如下方式就可以解决OOM问题:
ps = (PreparedStatement) con.prepareStatement("select * from bigTable",            ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);ps.setFetchSize(Integer.MIN_VALUE);ps.setFetchDirection(ResultSet.FETCH_REVERSE);

0 0
原创粉丝点击