天天看点

Mybatis批量操作优化

一、背景

在​

​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);
}