欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

SpringBoot+Mybatis如何實(shí)現(xiàn)流式查詢(xún)?

jf_ro2CN3Fa ? 來(lái)源:CSDN ? 2023-06-12 09:57 ? 次閱讀

什么是mybatis流式查詢(xún)?

使用mybatis作為持久層的框架時(shí),通過(guò)mybatis執(zhí)行查詢(xún)數(shù)據(jù)的請(qǐng)求執(zhí)行成功后,mybatis返回的結(jié)果集不是一個(gè)集合或?qū)ο?,而是一個(gè)迭代器,可以通過(guò)遍歷迭代器來(lái)取出結(jié)果集,避免一次性取出大量的數(shù)據(jù)而占用太多的內(nèi)存。

Cursor

org.apache.ibatis.cursor.Cursor接口有三個(gè)抽象方法,分別是

isOpen() :判斷cursor是否正處于打開(kāi)狀態(tài);

isConsumed() :判斷查詢(xún)結(jié)果是否全部讀取完;

getCurrentIndex() :查詢(xún)已讀取數(shù)據(jù)在全部數(shù)據(jù)里的索引位置;

publicinterfaceCursorextendsCloseable,Iterable{
//判斷cursor是否正處于打開(kāi)狀態(tài)
//當(dāng)返回true,則表示cursor已經(jīng)開(kāi)始從數(shù)據(jù)庫(kù)里刷新數(shù)據(jù)了;
booleanisOpen();
//判斷查詢(xún)結(jié)果是否全部讀取完;
//當(dāng)返回true,則表示查詢(xún)sql匹配的全部數(shù)據(jù)都消費(fèi)完了;
booleanisConsumed();
//查詢(xún)已讀取數(shù)據(jù)在全部數(shù)據(jù)里的索引位置;
//第一條數(shù)據(jù)的索引位置為0;當(dāng)返回索引位置為-1時(shí),則表示已經(jīng)沒(méi)有數(shù)據(jù)可以讀??;
intgetCurrentIndex();
}

代碼實(shí)現(xiàn)

mybatis的所謂流式查詢(xún),就是服務(wù)端程序查詢(xún)數(shù)據(jù)的過(guò)程中,與遠(yuǎn)程數(shù)據(jù)庫(kù)一直保持連接,不斷的去數(shù)據(jù)庫(kù)拉取數(shù)據(jù),提交事務(wù)并關(guān)閉sqlsession后,數(shù)據(jù)庫(kù)連接斷開(kāi),停止數(shù)據(jù)拉取,需要注意的是使用這種方式,需要自己手動(dòng)維護(hù)sqlsession和事務(wù)的提交。

1、實(shí)現(xiàn)方式很簡(jiǎn)單,原來(lái)返回的類(lèi)型是集合或?qū)ο?,流式查?xún)返回的的類(lèi)型Curor,泛型內(nèi)表示實(shí)際的類(lèi)型,其他沒(méi)有變化;

@Mapper
publicinterfacePersonDao{
CursorselectByCursor();
IntegerqueryCount();

}

select*fromsys_personorderbyiddesc


selectcount(*)fromsys_person

2、dao層向service層返回的是Cursor類(lèi)型對(duì)象,只要不提交關(guān)閉sqlsession,服務(wù)端程序就可以一直從數(shù)據(jù)數(shù)據(jù)庫(kù)讀取數(shù)據(jù),直到查詢(xún)sql匹配到數(shù)據(jù)全部讀取完;

示例里的主要業(yè)務(wù)邏輯是:從sys_person表中讀取所有的人員信息數(shù)據(jù),然后按照每1000條數(shù)據(jù)為一組,讀取到內(nèi)存里進(jìn)行處理,以此類(lèi)推,直到查詢(xún)sql匹配到數(shù)據(jù)全部處理完,再提交事務(wù),關(guān)閉sqlSession;

@Service
@Slf4j
publicclassPersonServiceImplimplementsIPersonService{
@Autowired
privateSqlSessionFactorysqlSessionFactory;

@Override
publicvoidgetOneByAsync()throwsInterruptedException{
newThread(newRunnable(){
@SneakyThrows
@Override
publicvoidrun(){
//使用sqlSessionFactory打開(kāi)一個(gè)sqlSession,在沒(méi)有讀取完數(shù)據(jù)之前不要提交事務(wù)或關(guān)閉sqlSession
log.info("----開(kāi)啟sqlSession");
SqlSessionsqlSession=sqlSessionFactory.openSession();
try{
//獲取到指定mapper
PersonDaomapper=sqlSession.getMapper(PersonDao.class);
//調(diào)用指定mapper的方法,返回一個(gè)cursor
Cursorcursor=mapper.selectByCursor();
//查詢(xún)數(shù)據(jù)總量
Integertotal=mapper.queryCount();
//定義一個(gè)list,用來(lái)從cursor中讀取數(shù)據(jù),每讀取夠1000條的時(shí)候,開(kāi)始處理這批數(shù)據(jù);
//當(dāng)前批數(shù)據(jù)處理完之后,清空l(shuí)ist,準(zhǔn)備接收下一批次數(shù)據(jù);直到大量的數(shù)據(jù)全部處理完;
ListpersonList=newArrayList<>();
inti=0;
if(cursor!=null){
for(Personperson:cursor){
if(personList.size()

應(yīng)用場(chǎng)景

其實(shí)mybatis的流式查詢(xún)適用范圍很有限,這里舉個(gè)例子,假如有這樣一個(gè)需求 :有50萬(wàn)員工的一年的工資數(shù)據(jù)明細(xì),需要輸出一張公司支出工資的數(shù)據(jù)報(bào)表。

需求很簡(jiǎn)單,估計(jì)有人是這樣想:這太簡(jiǎn)單了,查詢(xún)出員工的工資數(shù)據(jù)明細(xì),然后按照套上公式逐條計(jì)算出結(jié)果,然后匯總計(jì)算結(jié)果,插入到新的結(jié)果表里不就行了。事實(shí)上這件事絕對(duì)不簡(jiǎn)單:

50萬(wàn)的數(shù)據(jù)全部讀取到j(luò)vm的內(nèi)存里得占用多大空間?

這么多對(duì)象的垃圾回收又需要多久?

這么多數(shù)據(jù)計(jì)算是高頻行為還是低步行為?

如果計(jì)算到某條員工的數(shù)據(jù)發(fā)生異常,已經(jīng)計(jì)算好的數(shù)據(jù)要不要全部回滾?...

總之,直接取出50萬(wàn)數(shù)據(jù)來(lái)計(jì)算,風(fēng)險(xiǎn)肯定不小。那怎么辦呢?

在實(shí)際的開(kāi)發(fā)中,也經(jīng)常遇到一些百十萬(wàn),說(shuō)大不大,說(shuō)小不小的數(shù)據(jù)報(bào)表處理,我的主要設(shè)計(jì)思路通常就是數(shù)據(jù)切隔+異步,具體怎么做呢?結(jié)合上面的例子,是這樣的:

1、按照月份、省份或者部門(mén),對(duì)工資明細(xì)數(shù)據(jù)進(jìn)行數(shù)據(jù)切隔分組;

2、把不同月份、省份、部門(mén)的工資數(shù)據(jù)包裝成多線程任務(wù),放到線程池中去執(zhí)行;

3、根據(jù)切隔的多線程任務(wù)數(shù)量,定義一個(gè)同步工具類(lèi)CountDownLatch;

4、根據(jù)同步工具類(lèi)CountDownLatch,來(lái)判斷所有的多線程任務(wù)是否全部執(zhí)行完;等到所有的多線程任務(wù)全部執(zhí)行完成后,再執(zhí)行匯總的邏輯;

5、在多線程任務(wù)里,查詢(xún)具體月份、省份的員工工資數(shù)據(jù)明細(xì)的時(shí)候,如果數(shù)據(jù)量還是不少,就可以使用mybatis的流式查詢(xún),分批獲取員工工資明細(xì)數(shù)據(jù),進(jìn)行當(dāng)前批的計(jì)算、匯總,然后所有分批數(shù)據(jù)都計(jì)算完成后,再匯總所有分批數(shù)據(jù);

注意事項(xiàng)

mybatis的流式查詢(xún)的本意,是避免大量數(shù)據(jù)的查詢(xún)而導(dǎo)致內(nèi)存溢出,因此dao層查詢(xún)返回的是一個(gè)迭代器(Cursor),可以每次從迭代器中取出一條查詢(xún)結(jié)果,在實(shí)際業(yè)務(wù)開(kāi)發(fā)過(guò)程中,即是根據(jù)實(shí)際的jvm內(nèi)存大小,從迭代器中取出一定數(shù)量的數(shù)據(jù)后,再進(jìn)行數(shù)據(jù)處理,待處理完之后,繼續(xù)取出一定數(shù)據(jù)再處理,以此類(lèi)推直到全部數(shù)據(jù)處理完,這樣做的最大好處就是能夠降低內(nèi)存使用和垃圾回收器的負(fù)擔(dān),使數(shù)據(jù)處理的過(guò)程相對(duì)更加高效、可控,內(nèi)存溢出的風(fēng)險(xiǎn)較小;

好處很明顯,缺點(diǎn)也很就明顯,處理的時(shí)間可能會(huì)變長(zhǎng),需要引入多線程異步操作,并且在迭代器遍歷和數(shù)據(jù)處理的過(guò)程中,數(shù)據(jù)庫(kù)連接不能斷開(kāi),即當(dāng)前sqlSession要保持持續(xù)打開(kāi)狀態(tài),一量斷開(kāi),數(shù)據(jù)讀取就會(huì)中斷,所以關(guān)于這塊的處理,使用mybatis原生的sqlSession進(jìn)行手動(dòng)查詢(xún)、提交事務(wù)、回滾和關(guān)閉sqlSession最為穩(wěn)妥、最簡(jiǎn)單。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 迭代器
    +關(guān)注

    關(guān)注

    0

    文章

    44

    瀏覽量

    4350
  • SpringBoot
    +關(guān)注

    關(guān)注

    0

    文章

    174

    瀏覽量

    201

原文標(biāo)題:SpringBoot+Mybatis 如何實(shí)現(xiàn)流式查詢(xún),你知道嗎?

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    一文了解MyBatis查詢(xún)原理

    本文通過(guò)MyBatis一個(gè)低版本的bug(3.4.5之前的版本)入手,分析MyBatis的一次完整的查詢(xún)流程,從配置文件的解析到一個(gè)查詢(xún)的完整執(zhí)行過(guò)程詳細(xì)解讀
    的頭像 發(fā)表于 10-10 11:42 ?1476次閱讀

    SpringBoot配置Mybatis的2個(gè)錯(cuò)誤和修正

    SpringBoot】配置Mybatis錯(cuò)誤
    發(fā)表于 04-19 10:31

    在pom.xml中增加mybatis-generator相關(guān)配置的步驟

    springboot配置mybatis-generator生成mybatis相關(guān)接口、xml文件、和實(shí)體類(lèi)
    發(fā)表于 05-08 17:04

    基于SpringBoot mybatis方式的增刪改查實(shí)現(xiàn)

    SpringBoot mybatis方式實(shí)現(xiàn)增刪改查
    發(fā)表于 06-18 16:56

    數(shù)據(jù)庫(kù)整合Mybatis框架

    微服務(wù) SpringBoot 20(九):整合Mybatis
    發(fā)表于 07-16 11:03

    mybatis的最簡(jiǎn)兩種模式

    【本人禿頂程序員】springboot專(zhuān)輯:如何優(yōu)雅的使用mybatis
    發(fā)表于 10-23 09:01

    MyBatis的整合

    SpringBoot-15-之整合MyBatis-注解篇+分頁(yè)
    發(fā)表于 10-28 08:09

    基于java springboot電影購(gòu)票小程序源碼相關(guān)資料推薦

    后臺(tái)springboot mybatis 前端微信小程序電影院訂票系統(tǒng)用戶(hù)信息管理:用戶(hù)注冊(cè)后,可修改個(gè)人信息、登錄密碼等影片分類(lèi):對(duì)影片進(jìn)行分類(lèi),按類(lèi)型、國(guó)家區(qū)域分類(lèi),有篩選功能影片的信息:(影片
    發(fā)表于 12-30 06:14

    MyBatis實(shí)現(xiàn)原理

    本文主要詳細(xì)介紹了MyBatis實(shí)現(xiàn)原理。mybatis底層還是采用原生jdbc來(lái)對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作的,只是通過(guò) SqlSessionFactory,SqlSession Executor
    的頭像 發(fā)表于 02-24 11:25 ?6530次閱讀
    <b class='flag-5'>MyBatis</b>的<b class='flag-5'>實(shí)現(xiàn)</b>原理

    MyBatis流式查詢(xún)輕松幫你解決分頁(yè)慢的問(wèn)題

    作者丨捏造的信仰 segmentfault.com/a/1190000022478915 Part1基本概念 流式查詢(xún)指的是查詢(xún)成功后不是返回一個(gè)集合而是返回一個(gè)迭代器,應(yīng)用每次從迭代器取一條
    的頭像 發(fā)表于 08-04 15:52 ?4267次閱讀

    Fluent Mybatis、原生MybatisMybatis Plus對(duì)比

    使用fluent mybatis可以不用寫(xiě)具體的xml文件,通過(guò)java api可以構(gòu)造出比較復(fù)雜的業(yè)務(wù)sql語(yǔ)句,做到代碼邏輯和sql邏輯的合一。不再需要在Dao中組裝查詢(xún)或更新操作,在xml或
    的頭像 發(fā)表于 09-15 15:41 ?1486次閱讀

    源碼學(xué)習(xí)之MyBatis的底層查詢(xún)原理

    本文通過(guò)MyBatis一個(gè)低版本的bug(3.4.5之前的版本)入手,分析MyBatis的一次完整的查詢(xún)流程,從配置文件的解析到一個(gè)查詢(xún)的完整執(zhí)行過(guò)程詳細(xì)解讀
    的頭像 發(fā)表于 10-10 11:42 ?860次閱讀

    SpringBoot+ElasticSearch實(shí)現(xiàn)模糊查詢(xún)功能

    基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶(hù)小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶(hù)、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能
    的頭像 發(fā)表于 12-30 14:00 ?1088次閱讀

    MyBatis-Plus為什么不支持聯(lián)表

    `的所有功能`MyBatis Plus Join`同樣擁有;框架的使用方式和`MyBatis Plus`一樣簡(jiǎn)單,幾行代碼就能實(shí)現(xiàn)聯(lián)表查詢(xún)的功能
    的頭像 發(fā)表于 02-28 15:19 ?2549次閱讀
    <b class='flag-5'>MyBatis</b>-Plus為什么不支持聯(lián)表

    SpringBoot實(shí)現(xiàn)動(dòng)態(tài)切換數(shù)據(jù)源

    最近在做業(yè)務(wù)需求時(shí),需要從不同的數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)然后寫(xiě)入到當(dāng)前數(shù)據(jù)庫(kù)中,因此涉及到切換數(shù)據(jù)源問(wèn)題。本來(lái)想著使用Mybatis-plus中提供的動(dòng)態(tài)數(shù)據(jù)源SpringBoot的starter:dynamic-datasource-spring-boot-starter來(lái)
    的頭像 發(fā)表于 12-08 10:53 ?1079次閱讀
    <b class='flag-5'>SpringBoot</b><b class='flag-5'>實(shí)現(xiàn)</b>動(dòng)態(tài)切換數(shù)據(jù)源