MySQL数据库流式查询的使用
1. 背景
MySQL使用流式查询的目的,简单来说,就是避免查询数据量过大导致OOM。
详情可参考:https://www.jianshu.com/p/eedc9350f700
本文主要介绍流式查询在JDBC、JPA中的使用方法。
2. 使用
2.1 JDBC中的使用
部分主要代码片段如下:
@Test
public void testQuery() {
long startTime = System.currentTimeMillis();
//查询并处理逻辑
String sql = "select * from ordersummary limit 300000";
execute(sql, false);
long endTime = System.currentTimeMillis();
System.out.println("总记录条数为:" + count);
System.out.println("消耗时间为:" + (endTime - startTime));
}
private void execute(String sql, boolean isStreamQuery) {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
//获取数据库连接
conn = getConnection();
if (isStreamQuery) {
//设置流式查询参数
stmt = conn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
} else {
//普通查询
stmt = conn.prepareStatement(sql);
}
//执行查询获取结果
rs = stmt.executeQuery();
//遍历结果
while(rs.next()){
System.out.println(
rs.getString(1) + "=" + rs.getString(2) + "="
+ rs.getString(3) + "=" + rs.getString(4) + "="
+ rs.getString(5) + "=" + rs.getString(6) + "="
+ rs.getString(7) + "=" + rs.getString(8) + "="
+ rs.getString(9) + "=" + rs.getString(10)
);
count++;
}
} catch (SQLException e) {
//handle exception
} finally {
close(stmt, rs, conn);
}
}
查询30W条数据并打印,普通查询与流式查询耗时情况与内存变化图如下:
- 普通查询