一、背景
在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);
}