Mybatis批量操作优化
原创
©著作权归作者所有:来自51CTO博客作者FunkyTeddy的原创作品,请联系作者获取转载授权,否则将追究法律责任
一、背景
在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);
}