一、背景
在
Mybatis
经常会使用批量操作,比如大数据的批量查询,批量插入,如果直接查询,非常有可能发生
OOM
,解决思路一般使用内存队列,小批量加载,处理完再加载下一批次
二、优化
2.1 批量插入优化
默认情况使用
BatchExecutor
是一条条插入,我们可以使用
rewriteBatchedStatements
来改写,将一条条的
insert
改成单条
insert into xxx values (...), (...), (...)
语句的
insert
value
字段必须一样,不能(f1, f2), (f1, f2, f3)
保证5.1.13以上版本的
驱动
mysql
2.2 优化批量查询
@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);
}