当查询百万级或千万级大数据量的时候,MyBatis 普通查询(一次性查询出所有数据,将查询后的结果集全部塞给客户端)可能会 OOM(OutOfMemoryError)。使用游标可以节省内存消耗,不需要一次性取出所有数据,只需一次查询指定 fetchSize 的数据,直到把数据全部处理完。以下是项目中的demo。
  数据库表 tbl_mgm_menu 中已构造出大量数据(如何构造大量测试数据,见上一篇博客《MySQL - 使用存储过程快速制造大量测试数据》),springboot + mybatis 项目(见《SpringBoot 整合 MyBatis 配置多数据源操作MySQL数据库》),查询该表中的全部数据集,DAO 层接口定义如下。

package com.test.svc.dao.mgm;import com.test.svc.model.mgm.Menu;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.mapping.ResultSetType;import java.util.List;public interface MenuMapper {// @Options 标签配置可缺省@Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = 5)List<Menu> selectAll();
}

mapper 查询全部语句。

<select id="selectAll" resultMap="BaseResultMap">select<include refid="Base_Column_List" />from tbl_mgm_menu</select>

service 层调用示例。

package com.test.svc.service;import com.test.svc.ApplicationContextHelper;
import com.test.svc.dao.mgm.MenuMapper;
import com.test.svc.model.mgm.Menu;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.cursor.Cursor;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;/*** 综合查询类*/
@Service
@Slf4j
public class QueryService {@Resourceprivate MenuMapper menuMapper;/*** 游标查询全量列表** @return 全部菜单列表*/public List<Menu> listMenuByCursor() {long start = System.currentTimeMillis();List<Menu> menuList = new ArrayList<>();try {SqlSessionFactory mgmSqlSessionFactory = (SqlSessionFactory) ApplicationContextHelper.applicationContext.getBean("mgmSqlSessionFactory");SqlSession sqlSession = mgmSqlSessionFactory.openSession();Cursor<Menu> menus = sqlSession.selectCursor("com.test.svc.dao.mgm.MenuMapper.selectAll");Iterator iter = menus.iterator();while (iter.hasNext()) {Menu menu = (Menu) iter.next();menuList.add(menu);}menus.close();sqlSession.close();} catch (IOException e) {log.error("游标查询菜单列表出现异常", e);}long end = System.currentTimeMillis();log.info("游标查询菜单条数:[{}],耗时:[{}]ms", menuList.size(), (end - start));return menuList;}
}

MyBatis 游标查询大量数据相关推荐

  1. Oracle使用游标查询所有数据表备注

    功能作用:应用对应的SQL语句,能方便快速的查询Oracle数据库指定用户的所有用户表说明,快速知道每个数据表是做什么的,方便写文档和方案. 运行环境:搭建好Oracle数据库,并使用PQ/SQL D ...

  2. mybatis 游标查询_数据库游标(示例代码)

    游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制.游标充当指针的作用.尽管游标能遍历结果中的所有行,但他一次只指向一行. 概括来讲,SQL的游标是一种临时的数据库对象,即可以用来存 ...

  3. MyBatis Plus 解决大数据量查询慢问题

    分享知识 传递快乐 大数据量操作的场景大致如下: 数据迁移 数据导出 批量处理数据 在实际工作中当指定查询数据过大时,我们一般使用分页查询的方式一页一页的将数据放到内存处理.但有些情况不需要分页的方式 ...

  4. 大数据量查询:流式查询与游标查询

    最近在做一个计算相关的功能,大体就是有很多条SQL,每条SQL都涉及复杂地运算,最后要将所有计算结果进行合并分析.经初步测试,每个SQL起码会查出几十万条记录,我们现在有毛毛多的这种SQL. 最大的问 ...

  5. MyBatis中使用流式查询避免数据量过大导致OOM

    欢迎关注方志朋的博客,回复"666"获面试宝典 今天mybatis查询数据库中大量的数据,程序抛出: java.lang.OutOfMemoryError: Java heap s ...

  6. java in查询无法查询到数据(mybatis字符#与字符$的区别)

    mybatis字符#与字符$的区别 问题:使用in查询查询出一批数据,in查询的参数是字符串拼接的.调试过程中,把mybatis输出的sql复制到navicat中,在控制台将sql的参数也复制出来,替 ...

  7. oracle 游标查询数据库,Oracle数据库使用游标查询结果集所有数据

    --Oracle使用游标查询结果集所有数据 DECLARE myTabelName NVARCHAR2(200):=''; --表名 myTableRowComment NVARCHAR2(200): ...

  8. mybatis查询时间段数据

    mybatis查询时间段数据 1.页面表现形式 2.xml中代码如下 <if test="startTime!=null && startTime!=''"& ...

  9. 面试官问 ,Mybatis SELECT 查询, 集合或者单个对象,如果数据库不存在数据,需要判空吗?

    前言 于昨日下班时段,本人正在与生活作斗争,收到了金三银四一线作战小队成员紧急反应的战况问题. 不熟悉的或者是不知道怎么去看源码的看官,上车了. 正文 这面试题问的, 考察的是什么?  ① mybat ...

最新文章

  1. 用boolalpha输出true或false的问题
  2. python中webdriver_Linux上部署python+selenium+webdriver常见问题解决方案
  3. SecureCRT配置proxy连接云主机
  4. 【需求工程】需求分析的5W1H8C1D方法
  5. STL(七)——队列queue优先队列priority_queue
  6. ubuntu一键安装LAMP 及一键卸载
  7. 垃圾分类急上头?物联网卡来消愁
  8. fms +fme 视频直播
  9. 十大你不一定知道的牛逼技术问答社区
  10. iOS WKWebView与JS交互传值
  11. PAT Basic 1056
  12. Solr进阶之拼写纠错功能的实现基础拼音
  13. Linux 中最好的 CHM 文件阅读器
  14. eclipse 图形界面设计技巧——JLabel
  15. win10删除文件夹提示需要管理员权限的解决办法
  16. html网页运行环境,网站运行的环境要求
  17. 正牌韦小宝之奉旨沟女 解说
  18. xv6 6.S081 Lab5: cow
  19. OpenAI ChatGPT,爆火的OpenAi的ChatGPT聊天机器人注册和使用攻略,满满诚意哦
  20. PX4二次开发——PX4程序架构

热门文章

  1. 关于字符、字符集、编码和Unicode
  2. 通用路由封装协议--GRE的简单配置
  3. 微信小程序跳转美团外卖小程序时出现白屏解决demo
  4. 几何分布的期望和方差公式推导_算法数学基础-统计学最基础之均值、方差、协方差、矩...
  5. 【opencv】支付宝AR实景红包领取方法
  6. android虚拟机固定横屏幕竖屏,用VBox虚拟机安装Android 屏幕90度翻转竖屏设置
  7. 微型计算机硬件调研报告,计算机软硬件的产品调查报告分析.doc
  8. 如何在win10自带的Edge浏览器中切换成IE浏览器浏览网站
  9. winform去掉laber背景色
  10. Anaconda中pkgs文件夹详解