驱动版本:postgresql-42.3.8
满足条件
- fetchSize > 0
- !connection.getAutoCommit()=true
- 其他默认
实现代码
autoCommit=false
fetchSize>0
即可实现流式查询
public static void executeSqlByStream(Connection conn, String sql, Boolean autoCommit, Integer fetchSize, ResultStreamHandler<Map> callbackTask) {
AssertUtils.notBlank(sql, "execute sql can't be null.");
List<Map<String, Object>> result = Lists.newArrayList();
ResultSet res = null;
Statement statement = null;
Map<String, Object> ROW = Maps.newLinkedHashMap();
try {
conn.setAutoCommit(autoCommit);
statement = conn.createStatement();
statement.setFetchSize(fetchSize);
if (statement.execute(sql)) {
res = statement.getResultSet();
int columns = res.getMetaData().getColumnCount();
List<String> columnName = Lists.newArrayList();
for (int i = 0; i < columns; i++) {
columnName.add(res.getMetaData().getColumnLabel(i + 1));
}
while (res.next()) {
// 将数据处理,存入ROW
// 回调-数据处理
callbackTask.handleResult(ROW);
}
}
} catch (Exception e) {
throw new ServiceException(String.format("SQL select exception:%s", e.getMessage()), e);
} finally {
try {
conn.setAutoCommit(true);
} catch (SQLException e) {
e.printStackTrace();
}
closeDBResources(res, statement, null);
}
}