解析JDBC使用游标查询MySQL
流式查询【每次只取一条】
流式查询的条件是
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * from dwd_data_gen", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
// 每批拉取的数据量
preparedStatement.setFetchSize(Integer.MIN_VALUE);
代码
connection.setAutoCommit(false);
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * from dwd_data_gen", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
// 每批拉取的数据量
preparedStatement.setFetchSize(Integer.MIN_VALUE);
# 流式查询的时候,preparedStatement.executeQuery()并不会把数据取过来,而是调用resultSet.next()的时候 从服务端取一条数据过来。该方式不会出现OOM,因为每次都是只取一条数据
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
i++;
}
非流式查询【一次性全部查出来】
流式查询的条件不满足的时候就会在preparedStatement.executeQuery()的时候 把所有数据查出来
resultSet.next()只是从上面查出来的结果里面做判断而已,不会再从数据库取数据了
游标查询【每次取fetchSize条】
游标查询的条件是
jdbc的url里面加上useCursorFetch=true的参数
connection.setAutoCommit(false);
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * from dwd_data_gen", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
// 每批拉取的数据量
preparedStatement.setFetchSize(1024);