mybatis如何對大量數(shù)據(jù)的游標查詢
mybatis對大量數(shù)據(jù)的游標查詢
mapper定義
@Mapper public interface NewsRepository { String simpleQuery="select news.id,news.title,news.keywords," + " news.url,news.author," + " data.content,news.inputtime,news.updatetime " + " from news news join news_data data on news.id=data.id"; /** * 使用游標查詢數(shù)據(jù)數(shù)據(jù) * @return */ @Select(value = simpleQuery + " where status=1" + " order by news.id asc") @Options(fetchSize = Integer.MIN_VALUE)//mysql情況比較特殊,只能這樣設(shè)置 Cursor<News> scrollResult(); }
service內(nèi)使用
Cursor<News> cursor= repository.scrollResult(); Iterator<News> iter= cursor.iterator(); int count=0; while (iter.hasNext()){ System.err.println(iter.next().title); .......... }
mybatis游標查詢 org.apache.ibatis.cursor.Cursor
先說使用場景:針對超大數(shù)據(jù),內(nèi)存不夠存儲數(shù)據(jù)。
假設(shè)有一個1千萬的日志數(shù)據(jù),需要將這一千萬的數(shù)據(jù),全部都清洗一遍,從每一條的數(shù)據(jù)中查詢出匹配的有效數(shù)據(jù),且不能修改原始數(shù)據(jù)。
第一種辦法
一次性查出來,內(nèi)存不夠,而且會很慢,不可取。
這種方法就直接放棄。
第二種辦法
分頁查詢, 每次查詢1000條,每次處理完后,再分頁查詢。
這種分頁查詢,分頁會很慢,除非是有索引id,通過順序讀取,還有可以優(yōu)化一下。
第三種辦法
游標查詢 org.apache.ibatis.cursor.Cursor
數(shù)據(jù)庫查詢DAO
TempStudent 數(shù)據(jù)POJO
@Select(" SELECT * FROM temp_student ") Cursor<TempStudent> findListForCursor();
查詢的service
@Transactional public void scanTempStudent() { Cursor<TempStudent> cursor = tempStudentDao.findListForCursor(); cursor.forEach(foo -> { System.out.println(foo.getId() + ":" + foo.getName()); }); }
特別注意,需要加上一個注解 Transactional, 事物的注解
為什么呢?
在取數(shù)據(jù)的過程中需要保持數(shù)據(jù)庫連接,而 Mapper 方法通常在執(zhí)行完后連接就關(guān)閉了,因此 Cusor 也一并關(guān)閉了,所以加上了事物保障就可以
Spring 框架當中注解使用的坑:只在外部調(diào)用時生效。在當前類中調(diào)用這個方法,依舊會報錯。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
springBoot靜態(tài)資源加載不到,并且配置了也不生效問題及解決
這篇文章總結(jié)了一個在Spring Boot 2.6.x版本中,由于路徑匹配策略改變導(dǎo)致靜態(tài)資源無法加載的問題,并提供了解決方案:通過配置類或在配置文件中設(shè)置路徑匹配策略為AntPathMatcher,或者直接降級Spring Boot版本2025-02-02SpringBoot全局異常處理之多個處理器匹配順序(最新推薦)
這篇文章主要介紹了SpringBoot全局異常處理之多個處理器匹配順序(最新推薦),調(diào)試源碼可見匹配順序為:異常層級高者優(yōu)先,再清楚點,子類異常處理器優(yōu)先,本文給大家介紹的非常詳細,感興趣的朋友一起看看吧2024-03-03java虛擬機參數(shù)-D、-X和-XX的區(qū)別小結(jié)
本文主要介紹了java虛擬機參數(shù)-D、-X和-XX的區(qū)別小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06Springboot中@RequestParam和@PathVariable的用法與區(qū)別詳解
這篇文章主要介紹了Springboot中@RequestParam和@PathVariable的用法與區(qū)別詳解,RESTful API設(shè)計的最佳實踐是使用路徑參數(shù)來標識一個或多個特定資源,而使用查詢參數(shù)來對這些資源進行排序/過濾,需要的朋友可以參考下2024-01-01Java設(shè)計模式之工廠模式實現(xiàn)方法詳解
這篇文章主要介紹了Java設(shè)計模式之工廠模式實現(xiàn)方法,結(jié)合實例形式較為詳細的分析了工廠模式的分類、原理、實現(xiàn)方法與相關(guān)注意事項,需要的朋友可以參考下2017-12-12SpringBoot定制三種錯誤頁面及錯誤數(shù)據(jù)方法示例
Spring Boot提供的默認異常處理機制通常并不一定適合我們實際的業(yè)務(wù)場景,因此,我們通常會根據(jù)自身的需要對Spring Boot全局異常進行統(tǒng)一定制,例如定制錯誤頁面,定制錯誤數(shù)據(jù)等。本文主要介紹了SpringBoot三種自定義錯誤頁面的實現(xiàn),快來學(xué)習(xí)吧2021-12-12Java中基于推、拉模式的sentinel規(guī)則持久化詳解
這篇文章主要介紹了Java中基于推、拉模式的sentinel規(guī)則持久化詳解,推模式是sentinelDashboard?把規(guī)則推給Nacos,Nacos監(jiān)聽規(guī)則的變化推給微服務(wù),拉模式是sentinelDashboard?把規(guī)則直接給微服務(wù),?Nacos定時的同步微服務(wù)端的規(guī)則,需要的朋友可以參考下2023-09-09Java Scanner對象中hasNext()與next()方法的使用
這篇文章主要介紹了Java Scanner對象中hasNext()與next()方法的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10