欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Mybatis集成MySQL使用游標查詢處理大批量數(shù)據(jù)方式

 更新時間:2024年01月27日 09:50:12   作者:WannaRunning  
這篇文章主要介紹了Mybatis集成MySQL使用游標查詢處理大批量數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

背景

基于數(shù)據(jù)的時間范圍查詢,給符合條件的用戶推送積分即將到期的提醒。

初期用戶量小使用最普通簡單的分頁查詢掃描數(shù)據(jù)處理數(shù)據(jù)沒問題。隨著用戶量的上升表數(shù)據(jù)已經(jīng)上千萬,每天掃描處理的數(shù)量也超百萬,limit分頁出現(xiàn)了慢sql,任務執(zhí)行時間也達不到預期了。

上述方案出現(xiàn)瓶頸后考慮放棄limit方案,使用游標的方式進行全量數(shù)據(jù)的獲取,這樣一來SQL執(zhí)行快任務執(zhí)行也快。

MySQL游標查詢

useCursorFetch

使用游標查詢時,必須在jdbc url上設置連接屬性參數(shù)useCursorFetch=true

FetchSize

在設置了useCursorFetch=true后,需要在SQL中指定fetchSize,即一次獲取的數(shù)據(jù)量。

如果不設置fetchSize參數(shù),則執(zhí)行時仍然是全量返回,可能會出現(xiàn)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做大量數(shù)據(jù)查詢后寫入文件的代碼示例。

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是如何實現(xiàn)基于Cursor查詢的

com.mysql.cj.jdbc.result.ResultSetImpl實現(xiàn)類

ResultSetImpl 是mybatis中實現(xiàn)游標查詢結果解析的類。

這個實現(xiàn)類的next方法中調用了ResultsetRows接口的next方法。

ResultsetRows接口

ResultsetRows接口有ResultsetRowsCursor,ResultsetRowsStatic,ResultsetRowsStreaming三個實現(xiàn)類。

本文寫的游標查詢的場景,使用的是ResultsetRowsCursor這個實現(xiàn)類。

詳細看下ResultsetRowsCursor這個實現(xiàn)類,主要是實現(xiàn)了Iterator的hasNext和next方法,這也是使用Cursor獲取數(shù)據(jù)需要的兩個方法。

下面是hasnext方法的邏輯,根據(jù)下次要獲取的游標索引和當前本地數(shù)據(jù)集計算返回是否還有后續(xù)數(shù)據(jù)可以獲取。

下面是next方法的邏輯,先執(zhí)行一下hasnext的邏輯判斷,再取值

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • mysql之delete刪除記錄后數(shù)據(jù)庫大小不變

    mysql之delete刪除記錄后數(shù)據(jù)庫大小不變

    這篇文章主要介紹了mysql之delete刪除記錄后數(shù)據(jù)庫大小不變的相關資料,需要的朋友可以參考下
    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增刪改查語句是平時開發(fā)最常用的,需要的朋友可以參考下
    2023-01-01
  • 完美解決MySQL通過localhost無法連接數(shù)據(jù)庫的問題

    完美解決MySQL通過localhost無法連接數(shù)據(jù)庫的問題

    下面小編就為大家?guī)硪黄昝澜鉀QMySQL通過localhost無法連接數(shù)據(jù)庫的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • 安裝MySQL在最后的start service停住了解決方法

    安裝MySQL在最后的start service停住了解決方法

    今天為一個客戶配置服務器的時候,發(fā)現(xiàn)的問題,原來他自己安裝過mysql但安全沒有配置好,路徑選擇的也不好,重新安裝后發(fā)現(xiàn)在start service卡住了,通過下面的方法解決了,特分享下
    2013-11-11
  • Mysql行鎖和表鎖的實現(xiàn)示例

    Mysql行鎖和表鎖的實現(xiàn)示例

    行鎖和表鎖是兩種常見的鎖定機制,本文主要介紹了Mysql行鎖和表鎖,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-08-08

最新評論