一、背景

在​​Mybatis​​​经常会使用批量操作,比如大数据的批量查询,批量插入,如果直接查询,非常有可能发生​​OOM​​,解决思路一般使用内存队列,小批量加载,处理完再加载下一批次

二、优化

2.1 批量插入优化

默认情况使用​​BatchExecutor​​​是一条条插入,我们可以使用​​rewriteBatchedStatements​​​来改写,将一条条的​​insert​​​改成单条​​insert into xxx values (...), (...), (...)​

​insert​​​语句的​​value​​​字段必须一样,不能(f1, f2), (f1, f2, f3)
保证5.1.13以上版本的​​​mysql​​驱动

其他解决方法

2.2 优化批量查询

大数据查询,一般是在内存中计算,一种是批量导出

此处介绍使用​​mybatis​​的流式查询

@Slf4j
@Service
@RequiredArgsConstructor
public class UserService {

private final UserMapper userMapper;

public void exectue() {

userMapper.query(new ResultHandler<UserPO>() {
@Override
public void handleResult(ResultContext<? extends UserPO> resultContext) { }
});
}
}
@Mapper
public interface UserMapper {
@Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = Integer.MIN_VALUE)
@ResultType(UserPO.class)
@Select("SELECT * FROM ts_user")
void query(ResultHandler<UserPO> handler);
}