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 優化批量查詢

大數據查詢,一般是在內存中計算,一種是批量導出

此處介紹使用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);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章