首页
点滴
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(); } } ```
博客分类
源码解析 (1)
多线程 (5)
Java (10)
Linux (8)
Docker (9)
SpringBoot (14)
微服务 (1)
Redis (15)
MySQL (7)
VMware (3)
Nginx (15)
MyBatis (2)
RabbitMQ (1)
Git (7)
工具类 (12)
前端 (3)
友情链接
layui
© 2020-2025 www.chenhuazhan.com All Rights Reserved 备案号:
桂ICP备17004487号-1
粤公网安备44030002005146