在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

MyBatis流式查詢輕松幫你解決分頁慢的問題

5jek_harmonyos ? 來源:思否開發(fā)者社區(qū) ? 作者:捏造的信仰 ? 2021-08-04 15:52 ? 次閱讀

作者丨捏造的信仰

segmentfault.com/a/1190000022478915

Part1基本概念

流式查詢指的是查詢成功后不是返回一個集合而是返回一個迭代器,應用每次從迭代器取一條查詢結果。流式查詢的好處是能夠降低內(nèi)存使用。

如果沒有流式查詢,我們想要從數(shù)據(jù)庫取 1000 萬條記錄而又沒有足夠的內(nèi)存時,就不得不分頁查詢,而分頁查詢效率取決于表設計,如果設計的不好,就無法執(zhí)行高效的分頁查詢。因此流式查詢是一個數(shù)據(jù)庫訪問框架必須具備的功能。

流式查詢的過程當中,數(shù)據(jù)庫連接是保持打開狀態(tài)的,因此要注意的是:執(zhí)行一個流式查詢后,數(shù)據(jù)庫訪問框架就不負責關閉數(shù)據(jù)庫連接了,需要應用在取完數(shù)據(jù)后自己關閉。

Part2MyBatis 流式查詢接口

MyBatis 提供了一個叫 org.apache.ibatis.cursor.Cursor 的接口類用于流式查詢,這個接口繼承了 java.io.Closeable 和 java.lang.Iterable 接口,由此可知:

Cursor 是可關閉的。實際上當關閉 Cursor 時,也一并將數(shù)據(jù)庫連接關閉了;

Cursor 是可遍歷的。

除此之外,Cursor 還提供了三個方法:

isOpen():用于在取數(shù)據(jù)之前判斷 Cursor 對象是否是打開狀態(tài)。只有當打開時 Cursor 才能取數(shù)據(jù);

isConsumed():用于判斷查詢結果是否全部取完;

getCurrentIndex():返回已經(jīng)獲取了多少條數(shù)據(jù)。

因為 Cursor 實現(xiàn)了迭代器接口,因此在實際使用當中,從 Cursor 取數(shù)據(jù)非常簡單:

try(Cursor cursor = mapper.querySomeData()) {

cursor.forEach(rowObject -》 {

// 。。。

});

}

使用 try-resource 方式可以令 Cursor 自動關閉。

Part3但構建 Cursor 的過程不簡單

我們舉個實際例子。下面是一個 Mapper 類:

@Mapper

public interface FooMapper {

@Select(“select * from foo limit #{limit}”)

Cursor《Foo》 scan(@Param(“l(fā)imit”) int limit);

}

方法 scan() 是一個非常簡單的查詢。我們在定義這個方時,指定返回值為 Cursor 類型,MyBatis 就明白這個查詢方法是一個流式查詢。

然后我們再寫一個 SpringMVC Controller 方法來調(diào)用 Mapper(無關的代碼已經(jīng)省略):

@GetMapping(“foo/scan/0/{limit}”)

public void scanFoo0(@PathVariable(“l(fā)imit”) int limit) throws Exception {

try (Cursor《Foo》 cursor = fooMapper.scan(limit)) { // 1

cursor.forEach(foo -》 {}); // 2

}

}

假設 fooMapper 是 @Autowired 進來的。注釋 1 處是獲取 Cursor 對象并保證它能最后關閉;2 處則是從 cursor 中取數(shù)據(jù)。

上面的代碼看上去沒什么問題,但是執(zhí)行 scanFoo0(int) 時會報錯:

java.lang.IllegalStateException: A Cursor is already closed.

這是因為我們前面說了在取數(shù)據(jù)的過程中需要保持數(shù)據(jù)庫連接,而 Mapper 方法通常在執(zhí)行完后連接就關閉了,因此 Cusor 也一并關閉了。

所以,解決這個問題的思路不復雜,保持數(shù)據(jù)庫連接打開即可。我們至少有三種方案可選。

方案一:SqlSessionFactory

我們可以用 SqlSessionFactory 來手工打開數(shù)據(jù)庫連接,將 Controller 方法修改如下:

@GetMapping(“foo/scan/1/{limit}”)

public void scanFoo1(@PathVariable(“l(fā)imit”) int limit) throws Exception {

try (

SqlSession sqlSession = sqlSessionFactory.openSession(); // 1

Cursor《Foo》 cursor =

sqlSession.getMapper(FooMapper.class).scan(limit) // 2

) {

cursor.forEach(foo -》 { });

}

}

上面的代碼中,1 處我們開啟了一個 SqlSession (實際上也代表了一個數(shù)據(jù)庫連接),并保證它最后能關閉;2 處我們使用 SqlSession 來獲得 Mapper 對象。這樣才能保證得到的 Cursor 對象是打開狀態(tài)的。

方案二:TransactionTemplate

在 Spring 中,我們可以用 TransactionTemplate 來執(zhí)行一個數(shù)據(jù)庫事務,這個過程中數(shù)據(jù)庫連接同樣是打開的。代碼如下:

@GetMapping(“foo/scan/2/{limit}”)

public void scanFoo2(@PathVariable(“l(fā)imit”) int limit) throws Exception {

TransactionTemplate transactionTemplate =

new TransactionTemplate(transactionManager); // 1

transactionTemplate.execute(status -》 { // 2

try (Cursor《Foo》 cursor = fooMapper.scan(limit)) {

cursor.forEach(foo -》 { });

} catch (IOException e) {

e.printStackTrace();

}

return null;

});

}

上面的代碼中,1 處我們創(chuàng)建了一個 TransactionTemplate 對象(此處 transactionManager 是怎么來的不用多解釋,本文假設讀者對 Spring 數(shù)據(jù)庫事務的使用比較熟悉了),2 處執(zhí)行數(shù)據(jù)庫事務,而數(shù)據(jù)庫事務的內(nèi)容則是調(diào)用 Mapper 對象的流式查詢。注意這里的 Mapper 對象無需通過 SqlSession 創(chuàng)建。

方案三:@Transactional 注解

這個本質(zhì)上和方案二一樣,代碼如下:

@GetMapping(“foo/scan/3/{limit}”)

@Transactional

public void scanFoo3(@PathVariable(“l(fā)imit”) int limit) throws Exception {

try (Cursor《Foo》 cursor = fooMapper.scan(limit)) {

cursor.forEach(foo -》 { });

}

}

它僅僅是在原來方法上面加了個 @Transactional 注解。這個方案看上去最簡潔,但請注意 Spring 框架當中注解使用的坑:只在外部調(diào)用時生效。在當前類中調(diào)用這個方法,依舊會報錯。

以上是三種實現(xiàn) MyBatis 流式查詢的方法。

編輯:jq

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

    關注

    0

    文章

    60

    瀏覽量

    6713

原文標題:還在擔心分頁慢嗎? MyBatis 流式查詢解決你的煩惱

文章出處:【微信號:harmonyos_developer,微信公眾號:harmonyos_developer】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Mybatis 攔截器實現(xiàn)單數(shù)據(jù)源內(nèi)多數(shù)據(jù)庫切換

    作者:京東保險 王奕龍 物流的分揀業(yè)務在某些分揀場地只有一個數(shù)據(jù)源,因為數(shù)據(jù)量比較大,將所有數(shù)據(jù)存在一張表內(nèi)查詢速度,也為了做不同設備數(shù)據(jù)的分庫管理,便在這個數(shù)據(jù)源內(nèi)創(chuàng)建了多個不同庫名但表完全相同
    的頭像 發(fā)表于 12-12 10:23 ?725次閱讀

    什么是虛擬內(nèi)存分頁 Windows系統(tǒng)虛擬內(nèi)存優(yōu)化方法

    虛擬內(nèi)存分頁概述 在Windows操作系統(tǒng)中,虛擬內(nèi)存是通過分頁機制實現(xiàn)的。分頁允許系統(tǒng)將內(nèi)存中的數(shù)據(jù)移動到硬盤上,以便為當前運行的程序騰出空間。這個過程對于保持系統(tǒng)的流暢運行至關重要,尤其是在物理
    的頭像 發(fā)表于 12-04 09:16 ?322次閱讀

    Simplelink? CC3220-OV788音頻/視頻流式傳輸參考

    電子發(fā)燒友網(wǎng)站提供《Simplelink? CC3220-OV788音頻/視頻流式傳輸參考.pdf》資料免費下載
    發(fā)表于 09-02 11:13 ?0次下載
    Simplelink? CC3220-OV788音頻/視頻<b class='flag-5'>流式</b>傳輸參考

    滑動變阻器限流式分壓式接法區(qū)別

    滑動變阻器是一種常見的電子元件,用于調(diào)節(jié)電路中的電阻值。在實際應用中,滑動變阻器的接法主要有兩種:限流式和分壓式。這兩種接法在電路設計和應用中有著不同的優(yōu)缺點和適用范圍。 一、限流式接法 工作原理
    的頭像 發(fā)表于 08-05 14:37 ?3091次閱讀

    流式滑動變阻器的選型原則

    流式滑動變阻器,又稱為限流電阻器或限流電位器,是一種用于限制電路中電流大小的電子元件。在電子電路設計中,選擇合適的限流式滑動變阻器對于確保電路的穩(wěn)定運行和提高電路性能至關重要。 一、限流式滑動
    的頭像 發(fā)表于 08-05 14:31 ?889次閱讀

    流式傳感器的主要優(yōu)點是什么

    流式傳感器是一種基于渦流原理的非接觸式傳感器,廣泛應用于工業(yè)自動化、航空航天、能源、交通等領域。它具有許多優(yōu)點,使得其在眾多傳感器類型中脫穎而出。 1. 非接觸式測量 渦流式傳感器的工作原理是通過
    的頭像 發(fā)表于 07-26 15:10 ?821次閱讀

    使用mybatis切片實現(xiàn)數(shù)據(jù)權限控制

    一、使用方式 數(shù)據(jù)權限控制需要對查詢出的數(shù)據(jù)進行篩選,對業(yè)務入侵最少的方式就是利用mybatis或者數(shù)據(jù)庫連接池的切片對已有業(yè)務的sql進行修改。切片邏輯完成后,僅需要在業(yè)務中加入少量標記代碼
    的頭像 發(fā)表于 07-09 17:26 ?369次閱讀
    使用<b class='flag-5'>mybatis</b>切片實現(xiàn)數(shù)據(jù)權限控制

    流式繼電器工作特性有哪些

    流式繼電器是一種利用整流原理實現(xiàn)繼電器觸點切換的電子元件,廣泛應用于電力系統(tǒng)、工業(yè)自動化、通信設備等領域。 整流式繼電器的工作原理 整流式繼電器的工作原理基于整流原理。當輸入電壓達到一定值
    的頭像 發(fā)表于 06-28 10:26 ?753次閱讀

    流式繼電器輸入的是什么電源

    流式繼電器是一種常見的電氣元件,廣泛應用于電力系統(tǒng)、工業(yè)自動化、通信設備等領域。它的核心功能是將輸入的交流電源轉換為直流電源,以驅動繼電器的線圈,實現(xiàn)對電路的控制。本文將詳細介紹整流式繼電器
    的頭像 發(fā)表于 06-28 10:21 ?792次閱讀

    流式繼電器與無極繼電器的區(qū)別

    在電氣工程和自動化領域,繼電器是一種非常重要的控制元件。繼電器的主要作用是接收輸入信號,然后根據(jù)輸入信號的狀態(tài)來控制輸出電路的通斷。根據(jù)其工作原理和結構特點,繼電器可以分為很多種類,其中整流式繼電器
    的頭像 發(fā)表于 06-28 10:17 ?974次閱讀

    流式繼電器結構上有哪些特點

    流式繼電器是一種利用整流原理來實現(xiàn)繼電器動作的電氣設備,廣泛應用于電力系統(tǒng)、工業(yè)自動化、通信設備等領域。本文將詳細介紹整流式繼電器的結構特點,包括其工作原理、主要組成部分、性能指標、應用場景等方面
    的頭像 發(fā)表于 06-28 10:15 ?1015次閱讀

    流式繼電器屬于什么繼電器

    流式繼電器是一種特殊類型的繼電器,它主要用于將交流電轉換為直流電。這種繼電器在許多應用中都非常重要,例如在電力系統(tǒng)中,它可以用于控制和保護設備。在本文中,我們將詳細介紹整流式繼電器的工作原理、類型
    的頭像 發(fā)表于 06-28 10:07 ?734次閱讀

    分庫分表后復雜查詢的應對之道:基于DTS實時性ES寬表構建技術實踐

    分表,通過分庫分表應對存系統(tǒng)讀寫性能瓶頸和存儲瓶頸;分庫分表幫我們解決問題的同時,也帶來了復雜性;比如多條件的分頁查詢,多條件的聯(lián)表查詢變得復雜起來,通過調(diào)研我們發(fā)現(xiàn)針對這些分頁,聯(lián)表
    的頭像 發(fā)表于 06-25 18:30 ?863次閱讀
    分庫分表后復雜<b class='flag-5'>查詢</b>的應對之道:基于DTS實時性ES寬表構建技術實踐

    影響電動汽車交流充時間的因素有哪些?

    影響電動汽車交流充時間的因素有哪些? 電動汽車的充時間受到多個因素的影響。下面將詳細介紹這些因素,并解釋它們是如何影響充時間的。 首先,電動汽車的充時間受到電動汽車電池的容量的
    的頭像 發(fā)表于 04-08 16:13 ?1110次閱讀

    讓你的年終總結更有格調(diào)!訊飛星火AI商務鍵盤幫你輕松撰寫

    親愛的朋友們,年底了,是不是已經(jīng)開始忙碌起來準備年終總結了呢?別擔心,我們有科大訊飛AI智能鍵盤D1來幫你輕松撰寫! 首先,讓我來為大家介紹一下這款神奇的鍵盤。它擁有訊飛星火認知大模型,這可是我們
    的頭像 發(fā)表于 01-05 15:46 ?539次閱讀
    讓你的年終總結更有格調(diào)!訊飛星火AI商務鍵盤<b class='flag-5'>幫你</b><b class='flag-5'>輕松</b>撰寫
    主站蜘蛛池模板: a成人在线| 好吊妞视频988在线播放| 干一干操一操| freesexvideo性欧美医生护士| 欧美在线成人午夜影视| 日本亚洲视频| 欧美一级欧美三级| 未满十八18周岁禁止免费国产| 成人啪啪免费视频| 久久99热不卡精品免费观看| 日本大黄在线观看| 天天射天天干天天舔| 久久国产乱子伦精品免费一| 国产超爽人人爽人人做| 婷婷丁香综合| 国产成人精品曰本亚洲77美色| h视频日本| 四虎欧美| 韩国朴银狐诱感在线观看| 男人天堂资源网| 91大神在线视频观看| 日韩一区二区在线观看| 午夜看片网| 激情久久婷婷| 国产一区二卡三区四区| 天天天天操| xvideos69日本hd| 人人搞人人爽| 久久免费国产| 午夜欧美电影| 国产又色又爽又黄的网站在线一级| 成人午夜小视频手机在线看| 国产三级观看久久| 国产三及| 91三级在线| 狼人激情网| 在线免费观看色片| 我想看一级黄色片| 天天综合网天天综合色不卡| 朱元璋传奇1998王耿豪版| 大香伊在人线免费|