Mybatis集成MySQL使用游标查询处理大批量数据方式

 更新时间:2024年01月27日 09:50:12   作者:WannaRunning  
这篇文章主要介绍了Mybatis集成MySQL使用游标查询处理大批量数据方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

背景

基于数据的时间范围查询,给符合条件的用户推送积分即将到期的提醒。

初期用户量小使用最普通简单的分页查询扫描数据处理数据没问题。随着用户量的上升表数据已经上千万,每天扫描处理的数量也超百万,limit分页出现了慢sql,任务执行时间也达不到预期了。

上述方案出现瓶颈后考虑放弃limit方案,使用游标的方式进行全量数据的获取,这样一来SQL执行快任务执行也快。

MySQL游标查询

useCursorFetch

使用游标查询时,必须在jdbc url上设置连接属性参数useCursorFetch=true

FetchSize

在设置了useCursorFetch=true后,需要在SQL中指定fetchSize,即一次获取的数据量。

如果不设置fetchSize参数,则执行时仍然是全量返回,可能会出现OOM。

Mybatis集成Cursor查询

mapper接口方法返回值声明为Cursor类型,下面是SQL和Mapper的示例。

Cursor<Long> selectExpireCouponMember(@Param("endTime") String endTime);
 
 
<select id="selectExpireCouponMember" resultType="java.lang.Long" fetchSize="5000">
	select
		distinct member_id
	from t_dj_coupon
	where
	   end_time > end_time < #{endStartTime} and end_time < #{endTime}
</select>

下面是基于上面的SQL做大量数据查询后写入文件的代码示例。

String fileName = DateFormatUtils.format(System.currentTimeMillis(), DateUtils.PATTERN_YYYY_MM_DD) + "_status_push_member.txt";
File file = new File(fileName);
file.createNewFile();
 
fileWriter = new FileWriter(file);
bufferedWriter = new BufferedWriter(fileWriter);
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
	DjCouponMapper mapper = sqlSession.getMapper(DjCouponMapper.class);
	try (Cursor<Long> cursor = mapper.selectStartCouponMember(startDate, startDateEnd, BrandContextHolder.getBrandMdCode())) {
		Iterator<Long> iterator = cursor.iterator();
		Set<Long> couponMemberSet = new HashSet<>(pageSize.intValue());
		while (iterator.hasNext()) {
			couponMemberSet.add(iterator.next());
			writeNum++;
			if (couponMemberSet.size() >= pageSize) {
				bufferedWriter.write(couponMemberSet.toString());
				bufferedWriter.newLine();
				bufferedWriter.flush();
				writeLine++;
				couponMemberSet.clear();
			}
		
		}
		if (CollectionUtils.isNotEmpty(couponMemberSet)) {
			bufferedWriter.write(couponMemberSet.toString());
			bufferedWriter.newLine();
			bufferedWriter.flush();
			writeLine++;
		}
	}
}

Mybatis是如何实现基于Cursor查询的

com.mysql.cj.jdbc.result.ResultSetImpl实现类

ResultSetImpl 是mybatis中实现游标查询结果解析的类。

这个实现类的next方法中调用了ResultsetRows接口的next方法。

ResultsetRows接口

ResultsetRows接口有ResultsetRowsCursor,ResultsetRowsStatic,ResultsetRowsStreaming三个实现类。

本文写的游标查询的场景,使用的是ResultsetRowsCursor这个实现类。

详细看下ResultsetRowsCursor这个实现类,主要是实现了Iterator的hasNext和next方法,这也是使用Cursor获取数据需要的两个方法。

下面是hasnext方法的逻辑,根据下次要获取的游标索引和当前本地数据集计算返回是否还有后续数据可以获取。

下面是next方法的逻辑,先执行一下hasnext的逻辑判断,再取值

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • mysql之delete删除记录后数据库大小不变

    mysql之delete删除记录后数据库大小不变

    这篇文章主要介绍了mysql之delete删除记录后数据库大小不变的相关资料,需要的朋友可以参考下
    2016-06-06
  • mysql5.7.21安装配置教程

    mysql5.7.21安装配置教程

    这篇文章主要为大家详细介绍了mysql5.7.21安装配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • MySQL 8.0.15配置MGR单主多从的方法

    MySQL 8.0.15配置MGR单主多从的方法

    这篇文章主要介绍了MySQL 8.0.15配置MGR单主多从的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • mysql5.7.25使用全文检索功能的实例教程

    mysql5.7.25使用全文检索功能的实例教程

    其实全文检索在MySQL里面很早就支持了,下面这篇文章主要给大家介绍了关于mysql5.7.25使用全文检索功能的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • 解决阿里云ECS服务器下安装MySQL无法远程连接的问题

    解决阿里云ECS服务器下安装MySQL无法远程连接的问题

    这篇文章介绍了解决阿里云ECS服务器安装MySQL无法远程连接的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • MySQL删除表时I/O错误的原因分析与解决

    MySQL删除表时I/O错误的原因分析与解决

    这篇文章主要给大家介绍了关于MySQL删除表时I/O错误的原因分析与解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-08-08
  • MySQL基本增删改查语句练习(最新推荐)

    MySQL基本增删改查语句练习(最新推荐)

    这篇文章主要介绍了MySQL基本增删改查语句练习,本文给大家分享sql增删改查语句是平时开发最常用的,需要的朋友可以参考下
    2023-01-01
  • 完美解决MySQL通过localhost无法连接数据库的问题

    完美解决MySQL通过localhost无法连接数据库的问题

    下面小编就为大家带来一篇完美解决MySQL通过localhost无法连接数据库的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • 安装MySQL在最后的start service停住了解决方法

    安装MySQL在最后的start service停住了解决方法

    今天为一个客户配置服务器的时候,发现的问题,原来他自己安装过mysql但安全没有配置好,路径选择的也不好,重新安装后发现在start service卡住了,通过下面的方法解决了,特分享下
    2013-11-11
  • Mysql行锁和表锁的实现示例

    Mysql行锁和表锁的实现示例

    行锁和表锁是两种常见的锁定机制,本文主要介绍了Mysql行锁和表锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08

最新评论