亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java中的Cursor使用詳解

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

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

這里說的Cursor,一般來是JDBC的工具,像我在項目中的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用途一般就是遍歷查詢結果集,比如下面

        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);
        }

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

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

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

逐行讀取:
Cursor允許你逐行讀取數(shù)據(jù),而不是一次性將整個結果集加載到內存中。這對于處理非常大的數(shù)據(jù)集特別有用,因為它可以極大地減少內存消耗,避免內存溢出。

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

  • 流控制:

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

  • 并發(fā)控制:

提高并發(fā)性: Cursor可以提高數(shù)據(jù)庫多用戶并發(fā)訪問的性能,因為每個用戶只會鎖定當前正在讀取的行,而不是整個表或表的很大一部分。
事務一致性: Cursor可以與數(shù)據(jù)庫事務很好地結合,確保在事務處理期間數(shù)據(jù)的完整性和一致性。

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

在客戶端與數(shù)據(jù)庫服務器之間的網(wǎng)絡通信中,Cursor可以減少網(wǎng)絡流量,因為它逐行讀取數(shù)據(jù),而不是一次性傳輸整個結果集。

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

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

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

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

值得注意的是Cursor用使用try-with-resources語句來自動關閉它,不要占用寶貴的數(shù)據(jù)庫連接。

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

相關文章

  • 如何在SpringBoot項目中使用Oracle11g數(shù)據(jù)庫

    如何在SpringBoot項目中使用Oracle11g數(shù)據(jù)庫

    這篇文章主要介紹了在SpringBoot項目中使用Oracle11g數(shù)據(jù)庫的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java使用ChatGPT的API詳解

    Java使用ChatGPT的API詳解

    OpenAI API 幾乎可以應用于任何涉及理解或生成自然語言或代碼的任務。本文將帶你們介紹Java如何使用ChatGPT的API,感興趣的同學可以跟著小編一起來學習
    2023-04-04
  • 使用Spring?Cloud?Stream處理Java消息流的操作流程

    使用Spring?Cloud?Stream處理Java消息流的操作流程

    Spring?Cloud?Stream是一個用于構建消息驅動微服務的框架,能夠與各種消息中間件集成,如RabbitMQ、Kafka等,今天我們來探討如何使用Spring?Cloud?Stream來處理Java消息流,需要的朋友可以參考下
    2024-08-08
  • 數(shù)據(jù)結構與算法之并查集(不相交集合)

    數(shù)據(jù)結構與算法之并查集(不相交集合)

    并查集是一種挺高效的數(shù)據(jù)結構。實現(xiàn)簡單,只是所有元素統(tǒng)一遵從一個規(guī)律所以讓辦事情的效率高效起來。這篇文章主要介紹了數(shù)據(jù)結構與算法——并查集(不相交集合),需要的朋友可以參考下
    2019-11-11
  • 使用Java獲取linux和window序列號

    使用Java獲取linux和window序列號

    這篇文章主要為大家詳細介紹了如何使用Java獲取Windows和Linux系統(tǒng)上的CPU序列號、磁盤、mac地址等信息,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-01-01
  • java中生產者消費者問題和代碼案例

    java中生產者消費者問題和代碼案例

    大家好,本篇文章主要講的是java中生產者消費者問題和代碼案例,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • 關于JDK8升級17及springboot?2.x升級3.x詳細指南

    關于JDK8升級17及springboot?2.x升級3.x詳細指南

    這篇文章主要介紹了關于JDK8升級17及springboot?2.x升級3.x的相關資料,還討論了JPA包路徑從javax改為jakarta,以及Spring?Boot版本升級和Redis配置調整等,需要的朋友可以參考下
    2025-01-01
  • Java使用Apache Commons高效處理CSV文件的操作指南

    Java使用Apache Commons高效處理CSV文件的操作指南

    在 Java 開發(fā)中,CSV(Comma-Separated Values,逗號分隔值)是一種常見的數(shù)據(jù)存儲格式,廣泛用于數(shù)據(jù)交換和簡單的存儲任務,本文將介紹Java使用Apache Commons高效處理CSV文件的操作指南,需要的朋友可以參考下
    2025-03-03
  • 關于為何說JAVA中要慎重使用繼承詳解

    關于為何說JAVA中要慎重使用繼承詳解

    Java繼承是面向對象的最顯著的一個特征,然而下面這篇文章主要給大家介紹了關于為何說JAVA中要慎重使用繼承的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧
    2018-08-08
  • SPRING IOC注入方式過程解析

    SPRING IOC注入方式過程解析

    這篇文章主要介紹了SPRING IOC注入方式過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01

最新評論