首页
点滴
MyBatis中使用流式查询避免一次性查询数据量过大导致OOM
> 假设我们需要查询的用户表数据量非常大,那么可以采用mybatis流式查询 #### 先设置 fetchSize 属性,每次获取1000条数据 ```
SELECT * FROM t_user
``` > 对应的dao接口 ``` public interface UserMapper { List
findUserList(); } ``` #### 然后再创建一个结果处理器类实现 ResultHandler 接口 ``` public class UserResultHandler implements ResultHandler
{ // 这是每批处理的大小 private final static int BATCH_SIZE = 1000; // 存储每批数据的临时容器 private List
userList = new ArrayList<>(); @Override public void handleResult(ResultContext extends User> resultContext) { // 这里获取流式查询每次返回的单条结果 User user = resultContext.getResultObject(); // 你可以看自己的项目需要分批进行处理或者单个处理,这里以分批处理为例 userList.add(user); if (userList.size() == BATCH_SIZE) { handle(); } } private void handle() { try { // 在这里可以对你获取到的批量结果数据进行需要的业务处理 System.out.println(userList.size()); } finally { // 处理完每批数据后后将临时清空 userList.clear(); } } // 这个方法给外面调用,用来完成最后一批数据处理 public void end() { // 处理最后一批不到BATCH_SIZE的数据 handle(); } } ``` #### 最后在service层调用 ``` @Service public class UserService { @Autowired SqlSessionTemplate sqlSessionTemplate; public void findUserList() { UserResultHandler userResultHandler = new UserResultHandler(); String statement = "com.blog.mapper.UserMapper.findUserList"; sqlSessionTemplate.select(statement, userResultHandler); userResultHandler.end(); } } ```
博客分类
Java (6)
Linux (6)
Docker (3)
SpringBoot (9)
微服务 (1)
Redis (13)
Mysql (2)
VMware (3)
Nginx (9)
Mybatis (2)
工具类 (3)
友情链接
权限管理系统
layui
© 2019 chenhuazhan.com All Rights Reserved 备案号:
桂ICP备17004487号-1