有一种场景,导出文件100万条数据,如果直接mybatis把整个数据查询到list中,那么,就会有一个问题,如果数据量大的话,就会导致大对象,内存溢出(OOM),这个时候我们可以利用Mybatis中的ResultHandler来处理。
按照我们常有的逻辑:
查询所有用户:
在UserMapper.xml,当然了,常用的是分页查询,这里查询所有假设用在导出场景,并且建议不要用select *
<select id="getAllUser" resultType="component.pojo.User">
select * from User
</select>
UserMapper.java
List<User> getAllUser();
UserService.java
public void getAllUser() {
List<User> userList = UserMapper.getAllUser();
// 各种业务
}
然后就是导致容易OOM
那么我们现在改为用Mybatis的游标ResultHandler(Mybatis好像还有别的游标用法,我也没具体研究,只是这里是刚好遇到的情况)
在UserMapper.xml层面不变
<select id="getAllUser" resultType="component.pojo.User">
select * from User
</select>
UserMapper.java就要改变了,返回值必须为void,ResultHandler用在参数里面
void getAllUser(ResultHandler<User> resultHandler);
UserService.java
public void getAllUser() {
UserMapper.getAllUser(new ResultHandler<User>() {
@Override
public void handleResult(ResultContext<? extends ParkingLockDevice> resultContext) {
// 各种业务,从数据库查询到的数据也可以直接从resultContext中获取
}
});
}
这篇文章主要是我在遇到某个表拿取全部数据的问题,原本是直接取,后来担心OOM,于是乎使用了Mybatis的游标,但是并没有深究其底层。