目录
使用场景:大量数据查询,为了不占用过多内存,查询出来的数据快速处理。提高查询效率
一、controller
@ApiOperation(value = "测试流式查询")
@GetMapping("/streamFind")
public Message streamFind() {
userService.streamFind();
return sendSuccessMessage();
}
二、service
注意点:
- 需要加@Transactional事务,保持长链接
- 用Cursor(游标)接收,然后遍历这个cursor。mybatis就会按照你在userMapper里设置的fetchSize 大小,每次去从数据库拉取数据。
@Override
@Transactional
public List<UserEntity> streamFind() {
Cursor<UserEntity> cursor = userMapper.streamFind();
for (UserEntityentity : cursor) {
System.out.println("======" + entity.getId());
System.out.println("业务逻辑");
}
return null;
}
三、mapper
Cursor<RobotActionEntity> streamFind();
四、xml
注意点:
- fetchSize :每次从数据库取多少条数据回内存。
- resultSetType:需要设置为 FORWARD_ONLY, 意味着,查询只会单向向前读取数据。
<select id="streamFind" fetchSize="3" resultMap="ResultMap" resultSetType="FORWARD_ONLY">
select *
from robot_action
</select>
测试跑数:读取200万条数据,每次fetchSize读取1000条,batch总用时50s左右执行完。