为什么要使用流式读取:
在我们使用JDBC驱动从数据库获取数据的时候,一般情况下,进行一次查询,结果集是一次性从集群获取的,并存放在JDBC所在应用的内存中,这种情况如果查询的结果集比较大,将会导致应用内存增长速度陡增,影响别的内存操作,甚至是内存溢出,这种情况下,要么考虑增大应用内存,要么就需要开启JDBC的流式读取方式。
什么是流式读取:
流式读取方式可以通过数据流的方式,逐条从集群获取数据,将数据获取到JDBC应用所在内存中,从而减小大结果集对应用内存的影响。
注意:当出现以上问题时,应当先从业务角度分析,是否真实需要将很大的结果集查询出来并放到内存中,建议先优化应用,不建议用户开启流式读取,当开启流式读取时集群会生成一个临时表,占用临时表空间,频繁使用对集群有影响;另外如果必须开启流式读取,就必须将结果集内的数据消费完,集群才会认为读取任务结束。
代码示例如下:
streamStmt = Conn.createStatement(
java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_READ_ONLY);
streamStmt.setFetchSize(Integer.MIN_VALUE); // -2147483648 必须是固定值
while (rs.next()) { // 必须遍历完所有结果集
rs.getString(1);
}