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

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

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

3天內不再提示

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

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

作者丨捏造的信仰

segmentfault.com/a/1190000022478915

Part1基本概念

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

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

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

Part2MyBatis 流式查詢接口

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

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

Cursor 是可遍歷的。

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

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

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

getCurrentIndex():返回已經獲取了多少條數據。

因為 Cursor 實現了迭代器接口,因此在實際使用當中,從 Cursor 取數據非常簡單:

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(“limit”) int limit);

}

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

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

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

public void scanFoo0(@PathVariable(“limit”) int limit) throws Exception {

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

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

}

}

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

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

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

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

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

方案一:SqlSessionFactory

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

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

public void scanFoo1(@PathVariable(“limit”) 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 (實際上也代表了一個數據庫連接),并保證它最后能關閉;2 處我們使用 SqlSession 來獲得 Mapper 對象。這樣才能保證得到的 Cursor 對象是打開狀態的。

方案二:TransactionTemplate

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

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

public void scanFoo2(@PathVariable(“limit”) 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 處我們創建了一個 TransactionTemplate 對象(此處 transactionManager 是怎么來的不用多解釋,本文假設讀者對 Spring 數據庫事務的使用比較熟悉了),2 處執行數據庫事務,而數據庫事務的內容則是調用 Mapper 對象的流式查詢。注意這里的 Mapper 對象無需通過 SqlSession 創建。

方案三:@Transactional 注解

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

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

@Transactional

public void scanFoo3(@PathVariable(“limit”) int limit) throws Exception {

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

cursor.forEach(foo -》 { });

}

}

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

以上是三種實現 MyBatis 流式查詢的方法。

編輯:jq

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

    關注

    0

    文章

    63

    瀏覽量

    6844

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

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

收藏 人收藏

    評論

    相關推薦

    IP地址查詢技術

    IP查詢****的價值 根據2023年國際互聯網數據中心統計,全球每天產生的IP查詢請求超過50億次,這一數字就能夠清晰的看出廣大群眾對于IP查詢技術的需求以及它的價值。 而傳統IP查詢
    的頭像 發表于 02-12 11:13 ?261次閱讀
    IP地址<b class='flag-5'>查詢</b>技術

    一臺“兩棲”的光譜流式分析儀----CytoFLEX mosaic

    上海2025年2月6日?/美通社/ -- 貝克曼庫爾特生命科學正式推出CytoFLEX家族新成員:CytoFLEX mosaic光譜流式分析儀 它是一款具備"兩棲"能力的流式
    的頭像 發表于 02-06 20:03 ?238次閱讀
    一臺“兩棲”的光譜<b class='flag-5'>流式</b>分析儀----CytoFLEX mosaic

    老舊小區充電樁限流式保護器的應用

    摘要? ?隨著城市化進程的推進,老舊小區的電氣設施逐漸顯現出無法滿足現代用電需求的局面。特別是在老舊小區進行用電改造時,電氣安全問題尤為突出。傳統的電氣保護設備在短路和過載保護方面存在響應、壽命短
    的頭像 發表于 01-06 14:34 ?381次閱讀
    老舊小區充電樁限<b class='flag-5'>流式</b>保護器的應用

    Mybatis 攔截器實現單數據源內多數據庫切換

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

    什么是虛擬內存分頁 Windows系統虛擬內存優化方法

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

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

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

    滑動變阻器限流式分壓式接法區別

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

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

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

    使用mybatis切片實現數據權限控制

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

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

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

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

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

    流式繼電器與無極繼電器的區別

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

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

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

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

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

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

    分表,通過分庫分表應對存系統讀寫性能瓶頸和存儲瓶頸;分庫分表幫我們解決問題的同時,也帶來了復雜性;比如多條件的分頁查詢,多條件的聯表查詢變得復雜起來,通過調研我們發現針對這些分頁,聯表
    的頭像 發表于 06-25 18:30 ?1134次閱讀
    分庫分表后復雜<b class='flag-5'>查詢</b>的應對之道:基于DTS實時性ES寬表構建技術實踐
    主站蜘蛛池模板: 色天使在线观看 | 亚洲黄色三级 | 日韩色区 | 色天使美国 | youjizz国产 | 亚洲一二三四区 | 日本黄色a级 | 夜夜爽天天狠狠九月婷婷 | 神马午夜在线观看 | 老师喂我吃她的奶水脱她胸罩 | 国产手机在线国内精品 | 午夜69成人做爰视频网站 | 色网站在线播放 | 三级黄色在线视频 | 99久久国产免费中文无字幕 | 伊人久久大杳蕉综合大象 | 免费又爽又黄禁片视频在线播放 | 精品一区二区影院在线 | 狠狠燥 | 色综合久久天天综合绕观看 | 日韩一卡 二卡 三卡 四卡 免费视频 | 不卡一级毛片免费高清 | 午夜寂寞影视 | 日韩毛片免费线上观看 | 黄黄的网站在线观看 | 黄黄网 | 国产视频一区二区在线观看 | 男人的午夜 | 欧美色综合高清视频在线 | 欧美三级网 | 伊人久久大香线蕉综合网站 | 一级毛片aaaaaa免费看 | 欧美精品一区在线看 | 黄色伊人 | bt天堂网www连接 | 中文字幕一区二区三区精品 | 婷婷午夜天 | 性生生活三级视频在线观看 | 欧美成人精品久久精品 | 啪啪日韩| 日本三级带日本三级带黄首页 |