最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的Cursor使用詳解

 更新時(shí)間:2025年02月27日 17:06:12   作者:我是坑貨  
本文介紹了Java中的Cursor接口及其在大數(shù)據(jù)集處理中的優(yōu)勢(shì),包括逐行讀取、分頁(yè)處理、流控制、動(dòng)態(tài)改變查詢(xún)、并發(fā)控制和減少網(wǎng)絡(luò)流量等,感興趣的朋友一起看看吧

最近看代碼,有一段代碼涉及到Cursor,感覺(jué)寫(xiě)法挺有意思的。注意是Cursor,而不是Consumer,我之前把兩個(gè)搞混了,看代碼看的渾渾噩噩的。

這里說(shuō)的Cursor,一般來(lái)是JDBC的工具,像我在項(xiàng)目中的mybatis里面的Cursor。

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package org.apache.ibatis.cursor;
import java.io.Closeable;
public interface Cursor<T> extends Closeable, Iterable<T> {
    boolean isOpen();
    boolean isConsumed();
    int getCurrentIndex();
}

Cursor用途一般就是遍歷查詢(xún)結(jié)果集,比如下面

        try(Cursor<AssetDO> cursor = assetMapper.streamQueryAssetByRange(maps)) {
            Iterator<AssetDO> iterator = cursor.iterator();
            List<AssetDO> list = new LinkedList<>();
            while (iterator.hasNext()){
                list.add(iterator.next());
                if(tempCount % limitCount == 0){
                    consumer.accept(list);
                    list = new ArrayList<>();
                }
                assetCount++;
                tempCount++;
            }
            if(CollectionUtil.isNotEmpty(list)) {
                consumer.accept(list);
            }
        } catch (IOException e) {
            log.info(e.getMessage(), e);
        }

實(shí)際上不用這個(gè)我們也可以遍歷,直接查出結(jié)果集來(lái)遍歷,為什么還要用Cursor在包裝一層來(lái)遍歷。
實(shí)際上這個(gè)在數(shù)據(jù)量小的時(shí)候,實(shí)際上沒(méi)啥差距,甚至普通的查詢(xún)遍歷可讀性更強(qiáng)。主要是面對(duì)數(shù)據(jù)量大的時(shí)候,也就是大數(shù)據(jù)集處理會(huì)體現(xiàn)出的優(yōu)勢(shì),主要的原理就是它可以逐行讀取數(shù)據(jù),而不是先把整個(gè)結(jié)果集讀取加載到內(nèi)存中,這樣就可以節(jié)省內(nèi)存空間。實(shí)際上我們項(xiàng)目就會(huì)涉及到一個(gè)盤(pán)點(diǎn)的功能,當(dāng)涉及到范圍廣數(shù)據(jù)量大的情況,Cursor就很適合這種情況。

這邊說(shuō)一下Cursor的優(yōu)勢(shì):

  • 大數(shù)據(jù)集處理:

逐行讀取:
Cursor允許你逐行讀取數(shù)據(jù),而不是一次性將整個(gè)結(jié)果集加載到內(nèi)存中。這對(duì)于處理非常大的數(shù)據(jù)集特別有用,因?yàn)樗梢詷O大地減少內(nèi)存消耗,避免內(nèi)存溢出。

分頁(yè)處理: 可以根據(jù)需要處理一部分?jǐn)?shù)據(jù),然后再讀取下一部分,這樣可以實(shí)現(xiàn)數(shù)據(jù)的分頁(yè)加載。

  • 流控制:

動(dòng)態(tài)讀取: 你不需要在開(kāi)始時(shí)等待整個(gè)結(jié)果集從數(shù)據(jù)庫(kù)讀取完畢,可以立即處理第一條記錄,對(duì)于響應(yīng)時(shí)間非常重要的應(yīng)用場(chǎng)景非常有利。
動(dòng)態(tài)改變查詢(xún): 使用Cursor可以動(dòng)態(tài)改變查詢(xún)條件或者操作,而不是一次性固定查詢(xún)數(shù)據(jù)。

  • 并發(fā)控制:

提高并發(fā)性: Cursor可以提高數(shù)據(jù)庫(kù)多用戶(hù)并發(fā)訪問(wèn)的性能,因?yàn)槊總€(gè)用戶(hù)只會(huì)鎖定當(dāng)前正在讀取的行,而不是整個(gè)表或表的很大一部分。
事務(wù)一致性: Cursor可以與數(shù)據(jù)庫(kù)事務(wù)很好地結(jié)合,確保在事務(wù)處理期間數(shù)據(jù)的完整性和一致性。

  • 減少網(wǎng)絡(luò)流量:

在客戶(hù)端與數(shù)據(jù)庫(kù)服務(wù)器之間的網(wǎng)絡(luò)通信中,Cursor可以減少網(wǎng)絡(luò)流量,因?yàn)樗鹦凶x取數(shù)據(jù),而不是一次性傳輸整個(gè)結(jié)果集。

代碼上去看Cursor帶代碼,首先是接口,接口是相當(dāng)于一個(gè)規(guī)定,你可以根據(jù)這個(gè)規(guī)定寫(xiě)出一個(gè)更好的實(shí)現(xiàn)方案,這里就先看一下Cursor接口的三個(gè)方法:

isOpen()方法用于檢查游標(biāo)是否已經(jīng)打開(kāi)。如果游標(biāo)已經(jīng)打開(kāi)并且可以使用,該方法返回true,否則返回false。
isConsumed()方法用于檢查游標(biāo)中的所有數(shù)據(jù)是否都已經(jīng)被處理。如果游標(biāo)中的所有數(shù)據(jù)都已經(jīng)被讀取或者使用,該方法返回true,否則返回false。
getCurrentIndex()方法返回當(dāng)前游標(biāo)位于結(jié)果集的索引位置。這個(gè)索引位置從0開(kāi)始計(jì)數(shù),它可以用來(lái)跟蹤已經(jīng)處理的行數(shù)或條目數(shù)

這三個(gè)方法我們可以判斷是否數(shù)據(jù)集,一行一行讀取是否能讀完,當(dāng)前索引,這對(duì)我們遍歷很有用,本身這個(gè)接口就是Iterable迭代器。

一般我們選擇的ORM都會(huì)對(duì)應(yīng)這個(gè)接口有對(duì)應(yīng)的某人實(shí)現(xiàn)DefaultCursor。這個(gè)我么們可以通過(guò)idea工具來(lái)查看,總之當(dāng)遇到一個(gè)大數(shù)據(jù)集加載導(dǎo)致占用內(nèi)存飆升甚至內(nèi)存溢出,可以考慮采用這個(gè)Cursor工具,來(lái)減小內(nèi)存占用以及Cursor的并發(fā)提高效率算短時(shí)間。

值得注意的是Cursor用使用try-with-resources語(yǔ)句來(lái)自動(dòng)關(guān)閉它,不要占用寶貴的數(shù)據(jù)庫(kù)連接。

到此這篇關(guān)于Java中的Cursor使用詳解的文章就介紹到這了,更多相關(guān)Java Cursor使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot整合Druid實(shí)現(xiàn)SQL監(jiān)控和數(shù)據(jù)庫(kù)密碼加密

    SpringBoot整合Druid實(shí)現(xiàn)SQL監(jiān)控和數(shù)據(jù)庫(kù)密碼加密

    Druid連接池是阿里巴巴開(kāi)源的數(shù)據(jù)庫(kù)連接池項(xiàng)目,Druid連接池為監(jiān)控而生,內(nèi)置強(qiáng)大的監(jiān)控功能,監(jiān)控特性不影響性能,本文給大家介紹了SpringBoot整合Druid實(shí)現(xiàn)SQL監(jiān)控和數(shù)據(jù)庫(kù)密碼加密,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2024-06-06
  • Java 回調(diào)機(jī)制(CallBack) 詳解及實(shí)例代碼

    Java 回調(diào)機(jī)制(CallBack) 詳解及實(shí)例代碼

    這篇文章主要介紹了 Java 回調(diào)機(jī)制(CallBack) 詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Spring裝配Bean之用Java代碼安裝配置bean詳解

    Spring裝配Bean之用Java代碼安裝配置bean詳解

    這篇文章主要給大家介紹了關(guān)于Spring裝配Bean之用Java代碼安裝配置bean的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • Spring Cloud實(shí)現(xiàn)5分鐘級(jí)區(qū)域切換的操作方法

    Spring Cloud實(shí)現(xiàn)5分鐘級(jí)區(qū)域切換的操作方法

    Spring Cloud 2023.x通過(guò)智能路由預(yù)熱、多活數(shù)據(jù)同步和自動(dòng)化流量切換,實(shí)現(xiàn)5分鐘內(nèi)完成跨區(qū)域故障轉(zhuǎn)移,本文以某電商平臺(tái)從AWS亞太切換至阿里云華東的實(shí)戰(zhàn)為例,詳解關(guān)鍵技術(shù)路徑,需要的朋友可以參考下
    2025-04-04
  • SpringBoot依賴(lài)管理的源碼解析

    SpringBoot依賴(lài)管理的源碼解析

    這篇文章主要介紹了SpringBoot依賴(lài)管理的源碼解析,maven提供了一套依賴(lài)管理機(jī)制,通過(guò)在pom.xml定義坐標(biāo),通過(guò)坐標(biāo)從互聯(lián)網(wǎng)的中央倉(cāng)庫(kù)下載依賴(lài)的構(gòu)件(jar包),規(guī)范去管理依賴(lài)所有構(gòu)件,這就叫依賴(lài)管理,需要的朋友可以參考下
    2023-04-04
  • Java中的JetCache?實(shí)戰(zhàn)

    Java中的JetCache?實(shí)戰(zhàn)

    這篇文章主要介紹了Java中的JetCache實(shí)戰(zhàn),JetCache是一個(gè)基于Java的緩存系統(tǒng)封裝,提供統(tǒng)一的API和注解來(lái)簡(jiǎn)化緩存的使用,下文更多相關(guān)資料需要的小伙伴可以參考一下
    2022-04-04
  • Java實(shí)現(xiàn)Excel數(shù)據(jù)導(dǎo)出的實(shí)戰(zhàn)指南

    Java實(shí)現(xiàn)Excel數(shù)據(jù)導(dǎo)出的實(shí)戰(zhàn)指南

    Excel 導(dǎo)出是后臺(tái)管理系統(tǒng)中的標(biāo)配功能,用于將系統(tǒng)數(shù)據(jù)導(dǎo)出為 Excel 文件供用戶(hù)下載、分析或歸檔,本文提供了一個(gè)完整的Excel數(shù)據(jù)導(dǎo)出實(shí)戰(zhàn)指南,主要針對(duì)后臺(tái)管理系統(tǒng)中的員工信息導(dǎo)出場(chǎng)景,有需要的小伙伴可以了解下
    2026-06-06
  • 深入理解Java中的HashMap的實(shí)現(xiàn)機(jī)制

    深入理解Java中的HashMap的實(shí)現(xiàn)機(jī)制

    這篇文章主要介紹了深入理解Java中的HashMap的實(shí)現(xiàn)機(jī)制,同時(shí)也有助于理解Java中對(duì)于哈希函數(shù)的相關(guān)處理方式,需要的朋友可以參考下
    2015-07-07
  • SpringBoot中創(chuàng)建bean的7種方式總結(jié)

    SpringBoot中創(chuàng)建bean的7種方式總結(jié)

    Spring是一款廣泛應(yīng)用于企業(yè)級(jí)應(yīng)用程序開(kāi)發(fā)的Java框架,其 IOC 和 DI 特性可以有效地管理應(yīng)用程序中的對(duì)象,提高了應(yīng)用程序的可維護(hù)性和可擴(kuò)展性,那你知道spring有哪些方式將bean放入容器嘛,今天就給大家總結(jié)一下
    2023-07-07
  • Hibernate中Session增刪改查操作代碼詳解

    Hibernate中Session增刪改查操作代碼詳解

    這篇文章主要介紹了Hibernate中Session增刪改查操作代碼詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12

最新評(píng)論

左贡县| 石棉县| 龙山县| 高唐县| 石阡县| 望城县| 丁青县| 武夷山市| 北票市| 民县| 贵阳市| 晋中市| 定陶县| 突泉县| 扶绥县| 鹤庆县| 泗水县| 寿光市| 鹤岗市| 工布江达县| 邓州市| 青州市| 麻城市| 阳西县| 乐业县| 宣城市| 恩施市| 广水市| 额济纳旗| 安宁市| 六安市| 泽州县| 门头沟区| 余江县| 防城港市| 临安市| 岱山县| 通渭县| 龙江县| 吴堡县| 克东县|