MySQL读取百万数据,使用流式、游标查询实战
mybatis 实现流式查询、游标查询很简单
- 第一步:需要设置连接属性 useCursorFetch=true
jdbc:mysql://127.0.0.1:3306/test?useCursorFetch=true
- 第二步:设置 fetchSize,流式查询设置成 Integer.MIN_VALUE 即 -2147483648;游标查询设置成我们想要的值
<!-- 流式查询 -->
<select id="streamingQuery" fetchSize="-2147483648" resultMap="BaseResultMap">
select id, name from user limit 10
</select>
<!-- 游标查询 -->
<select id="cursorQuery" fetchSize="3" resultMap="BaseResultMap">
select id, name from user limit 10
</select>
- 第三步: Mapper 需要返回 Cursor
Cursor<User> streamingQuery();
Cursor<User> cursorQuery();
- 第四步:for循环接受数据
@RestController
public class TestController {
private final UserMapper userMapper;
public TestController(UserMapper userMapper) {
this.userMapper = userMapper;
}
// 注意点:获取数据时要保证数据库连接没有被回收,这里使用了 @Transactional 保证
@Transactional
@GetMapping("streaming")
public List<User> streamingQuery() {
Cursor<User> cursor = userMapper.streamingQuery();
return getData(cursor);
}
@Transactional
@GetMapping("cursor")
public List<User> cursorQuery() {
Cursor<User> cursor = userMapper.cursorQuery();
return getData(cursor);
}
public List<User> getData(Cursor<User> cursor) {
List<User> list = new LinkedList<>();
cursor.forEach(list::add);
return list;
}
}