mybatis如何對(duì)大量數(shù)據(jù)的游標(biāo)查詢
mybatis對(duì)大量數(shù)據(jù)的游標(biāo)查詢
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";
/**
* 使用游標(biāo)查詢數(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游標(biāo)查詢 org.apache.ibatis.cursor.Cursor
先說使用場(chǎng)景:針對(duì)超大數(shù)據(jù),內(nèi)存不夠存儲(chǔ)數(shù)據(jù)。
假設(shè)有一個(gè)1千萬的日志數(shù)據(jù),需要將這一千萬的數(shù)據(jù),全部都清洗一遍,從每一條的數(shù)據(jù)中查詢出匹配的有效數(shù)據(jù),且不能修改原始數(shù)據(jù)。
第一種辦法
一次性查出來,內(nèi)存不夠,而且會(huì)很慢,不可取。
這種方法就直接放棄。
第二種辦法
分頁查詢, 每次查詢1000條,每次處理完后,再分頁查詢。
這種分頁查詢,分頁會(huì)很慢,除非是有索引id,通過順序讀取,還有可以優(yōu)化一下。
第三種辦法
游標(biāo)查詢 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());
});
}特別注意,需要加上一個(gè)注解 Transactional, 事物的注解
為什么呢?
在取數(shù)據(jù)的過程中需要保持?jǐn)?shù)據(jù)庫連接,而 Mapper 方法通常在執(zhí)行完后連接就關(guān)閉了,因此 Cusor 也一并關(guān)閉了,所以加上了事物保障就可以
Spring 框架當(dāng)中注解使用的坑:只在外部調(diào)用時(shí)生效。在當(dāng)前類中調(diào)用這個(gè)方法,依舊會(huì)報(bào)錯(cuò)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java進(jìn)階學(xué)習(xí)之如何開啟遠(yuǎn)程調(diào)式
Java開發(fā)中的遠(yuǎn)程調(diào)試是一項(xiàng)至關(guān)重要的技能,特別是在處理生產(chǎn)環(huán)境的問題或者協(xié)作開發(fā)時(shí),這篇文章主要介紹了Java進(jìn)階學(xué)習(xí)之如何開啟遠(yuǎn)程調(diào)式的相關(guān)資料,需要的朋友可以參考下2025-03-03
利用spring boot如何快速啟動(dòng)一個(gè)web項(xiàng)目詳解
這篇文章主要給大家介紹了關(guān)于利用spring boot如何快速啟動(dòng)一個(gè)web項(xiàng)目的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧、2017-12-12
Spring Security 密碼驗(yàn)證動(dòng)態(tài)加鹽的驗(yàn)證處理方法
小編最近在改造項(xiàng)目,需要將gateway整合security在一起進(jìn)行認(rèn)證和鑒權(quán),今天小編給大家分享Spring Security 密碼驗(yàn)證動(dòng)態(tài)加鹽的驗(yàn)證處理方法,感興趣的朋友一起看看吧2021-06-06
Java實(shí)現(xiàn)三子棋小游戲簡(jiǎn)易版
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)三子棋小游戲簡(jiǎn)易版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
Java ShardingJDBC實(shí)戰(zhàn)演練
Sharding-JDBC 采用在 JDBC 協(xié)議層擴(kuò)展分庫分表,是一個(gè)以 jar 形式提供服務(wù)的輕量級(jí)組件,其核心思路是小而美地完成最核心的事情2021-11-11

