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