国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

大數(shù)據(jù)量查詢:流式查詢與游標查詢

這篇具有很好參考價值的文章主要介紹了大數(shù)據(jù)量查詢:流式查詢與游標查詢。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

? ? ? ? 最近在做一個計算相關的功能,大體就是有很多條SQL,每條SQL都涉及復雜地運算,最后要將所有計算結果進行合并分析。經(jīng)初步測試,每個SQL起碼會查出幾十萬條記錄,我們現(xiàn)在有毛毛多的這種SQL。

? ? ? ? 最大的問題不在于速度,畢竟涉及運算的功能,想要從速度入手就得靠中間件和算法了。內存占用才是我們最需要注意的,一旦數(shù)據(jù)量很大且一次性沖入Java堆內存,程序會直接OOM然后離開人世。比如使用非分頁的普通查詢,這張表1000w條數(shù)據(jù)你有多少要多少,除非你設置-xms 128g,否則程序是一定會死的。

? ? ? ? 當然平時我們一般都會指定分頁參數(shù),但遇到大數(shù)據(jù)量查詢時,為了內存的身體健康,還是需要一些特殊的方式——流式查詢與游標查詢。

1 流式查詢

? ? ? ?采用傳統(tǒng)的Stream流式思想,將直接提供數(shù)據(jù)替換成提供獲取數(shù)據(jù)的管道,客戶端讀取數(shù)據(jù)時直接從管道中遍歷獲取;整個讀取的過程需要客戶端保持和服務端的連接,也很好理解,它實際是一個管道,管道得通著才能取數(shù)據(jù)。

? ? ? ? 流式查詢有兩種使用方式,一種是用Cursor<T>作為返回值,對數(shù)據(jù)進行遍歷操作;一種是不設置返回值,在入?yún)⒅袀魅胍粋€ResultHandler<T>作為回調處理數(shù)據(jù)。本文將基于Mybatis具體介紹使用方法。

? ? ? ? 這兩種返回值的使用方式是相似的,唯一區(qū)別就是返回值不同。Mybatis查詢有兩種方式,一種是基于注解加在Mapper接口上方,一種是寫在xml文件中,主要需要設置以下幾個屬性:

ResultSetType 結果集讀取方式
FetchSize MySQL服務端單次發(fā)送至客戶端的數(shù)據(jù)條數(shù)
ResultType 這個眼熟吧,設置返回實體類映射

? ? ? ? ResultType沒什么好說的,一般Mybatis查詢都會用到,我們著重介紹一下ResultSetType和FetchSize。ResultSetType有4種可選項,我們點進去看看,DEFAULT不談,主要是下面三種。?

    DEFAULT(-1),
    FORWARD_ONLY(1003),
    SCROLL_INSENSITIVE(1004),
    SCROLL_SENSITIVE(1005);
  • FORWARD_ONLY,顧名思義只能向前,即數(shù)據(jù)只能向前讀取,是不是就類似一個流水的管道,讀一條就相當于水流過去一些。也是我們需要選用的。
  • SCROLL_INSENSITIVE,不敏感滾動,和下面那個差不多,都是可以向后讀或向前讀;這意味著已讀取過的數(shù)據(jù)不能丟掉,要繼續(xù)保存在內存中,因為有可能會回去再次讀取他們。
  • SCROLL_SENSITIVE,敏感滾動,和上面那個差不多。

? ? ? ? 這么一比較就看得出來,當選的一定是FORWARD_ONLY,我們亟需解決的就是大數(shù)據(jù)量對內存的影響,再用后面兩個還是會放在內存中。

? ? ? ? 再看FetchSize,這個概念在許多服務中都有提及,例如RabbitMQ中是消費者取過來預處理的消息數(shù)量,但在MySQL中完全不是一個概念。MySQL的數(shù)據(jù)傳輸是基于C/S的阻塞機制,即Client設置FetchSize = 1000,而Server查出來10000條數(shù)據(jù),按照常理應該是Server智能地使用分頁策略1000條1000條取;實際不是,Server查出來多少就是多少,他會放在自己特定的內存空間內,只是會根據(jù)FetchSize的大小一點一點傳送給Client——利用C/S的通訊阻塞,發(fā)1000條、堵一下、發(fā)1000條、堵一下……。

? ? ? ? 話又說回來,怎么配置這個FetchSize呢?JDBC官方給出的答案是設置為“Integer.MIN_VALUE”,具體原因不清楚,但我猜是為了和游標查詢區(qū)分開,因為一會你會發(fā)現(xiàn)流式查詢和游標查詢唯一的區(qū)別就是FetchSize的大小。

? ? ? ? 設置好這3個參數(shù)以后,就可以用Cursor或者ResultHandler來處理返回值了。有如下幾種寫法。

(1)注解式?

    @Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = Integer.MIN_VALUE)
    @ResultType(ResultVo.class)
    @Select("SELECT *, 0 orderType FROM `table`\n" +
            "        WHERE username = #{userName}")
    Cursor<ResultVo> listOrders(@Param("userName") String userName);

    @Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = Integer.MIN_VALUE)
    @ResultType(ResultVo.class)
    @Select("SELECT *, 0 orderType FROM `table`\n" +
            "        WHERE username = #{userName}")
    void listOrders2(@Param("userName") String userName, ResultHandler<ResultVo> handler);

? ? ? ? 使用Mybatis的注解,在@Options中指定查詢配置參數(shù),在@ResultType中指定返回值類型?,在@Select中指定查詢語句。最后用Cursor接收返回值,Cursor是可遍歷的,所以直接Foreach遍歷即可;或者用ResultHandler處理數(shù)據(jù)回調,在調用方式時傳入new ResultHandler并寫明處理邏輯。

(2)xml方式

<select id="listOrders" resultType="com.vo.ResultVo" resultSetType="FORWARD_ONLY" fetchSize="-2147483648">
    SELECT *, 1 stuffCount, 1 orderType FROM `table`
    WHERE username = #{userName}
</select>

? ? ? ? 本質是相同的,只不過是將注解中的內容放進了標簽中,返回值和數(shù)據(jù)處理方式也一致。

? ? ? ? 需要注意的是,不可以注解 + xml混合使用,比如注解指定fetchSize,xml只寫查詢語句,這種只有xml語句會生效?。。∫蝗米⒔?,要不全用xml?。。?

2 游標查詢

? ? ? ? 游標查詢主要依靠FetchSize屬性,指定Server每次傳輸給Client數(shù)據(jù)的條數(shù)。這種方式由于我沒有實驗就不賣弄了,使用方式和流式查詢基本一致,只是FetchSize不能是Integer.MIN_VALUE,而是一個真實的數(shù)字,不能太大也不能太小,太大了內存受不了,太小了客戶受不了。

? ? ? ? 不過JDBC查詢默認是不支持FetchSize屬性的,需要在JDBC連接URL后面加上“useCursorFetch=true”。這就不是很理想了,你說你寫個代碼還要改數(shù)據(jù)庫連接的屬性,萬一后面出任何查詢上的問題,都有可能追溯到你頭上,所以我沒敢用游標查詢。

3 注意點

? ? ? ? 流式查詢由于需要保持客戶端與服務端的連接,而一般查詢提交完連接就會關閉;因此我們需要保持事務開啟,否則會報“A Cursor is already closed.”,即Cursor已經(jīng)關閉,沒法再讀取了。最簡單的方法就是在方法上加@Transactional,在查詢完畢以前事務會一直持有這個數(shù)據(jù)庫連接,但我們在使用完畢后也要自行關閉連接,顯式調用Cursor.close(),或者用try with resource語句。

? ? ? ??還要知道如何判斷自己是否使用了流式查詢或游標查詢,下面是幾個數(shù)據(jù)集的對應關系:

查詢方式 結果集類型 行數(shù)據(jù)類型
普通分頁 ResultsetRowsStatic RowDataStatic
流式查詢 ResultsetRowsStreaming RowDataDynamic
游標查詢 ResultsetRowsCursor RowDataCursor

? ? ? ? 我使用到的流式查詢,debug到DefaultResultSetHandler.class中,顯示rsw中確實存儲了ResultSetRowsStreaming。

流式查詢和游標查詢,sql,數(shù)據(jù)庫,spring cloud,spring boot,微服務

4 優(yōu)劣分析

? ? ? ? 這3種查詢方式,常規(guī)非大數(shù)據(jù)模式下普通查詢最快,其次是流式查詢,最次是游標查詢。

????????主要是由于游標查詢需要和數(shù)據(jù)庫進行多次網(wǎng)絡交互,Client處理完這部分后再拉取下一部分數(shù)據(jù),因此會比較慢。但是流式查詢又會長時間占用同一個數(shù)據(jù)庫連接,因此要取舍一下是能接受連接一直持有但是可能會堵住導致響應慢,還是可能占用較多連接數(shù)但單次響應快。文章來源地址http://www.zghlxwxcb.cn/news/detail-615568.html

到了這里,關于大數(shù)據(jù)量查詢:流式查詢與游標查詢的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 關系數(shù)據(jù)庫SQL數(shù)據(jù)查詢

    關系數(shù)據(jù)庫SQL數(shù)據(jù)查詢

    1.查詢僅涉及一個表,選擇表中的若干列 查詢全部列 選出所有屬性列: 在SELECT后面列出所有列名 將目標列表達式指定為 * 查詢經(jīng)過計算的值 SELECT子句的目標列表達式不僅可以為表中的屬性列,也可以是表達式 使用列別名改變查詢結果的列標題: 2.選擇表中的若干元組

    2024年02月09日
    瀏覽(19)
  • 數(shù)據(jù)庫SQL查詢相關練習

    1、顯示所有職工的基本信息。 2、查詢所有職工所屬部門的部門號,不顯示重復的部門號。 3、求出所有職工的人數(shù)。 4、列出最高工和最低工資。 5、列出職工的平均工資和總工資。 6、創(chuàng)建一個只有職工號、姓名和參加工作的新表,名為工作日期表。 8、列出所有姓劉的職工

    2024年01月25日
    瀏覽(19)
  • 數(shù)據(jù)庫作業(yè)-sql語句查詢

    建表的插入數(shù)據(jù)的表 數(shù)據(jù)庫作業(yè)-sql建表和插入數(shù)據(jù)_快樂的xiao何的博客-CSDN博客 create table supplier( supplierno char(6) primary key, suppliername nvarchar(10), address nvarchar(20), number char(11) )create table category( categoryno char(5) primary key, categoryname varchar(20), descriptions text... https://blog.csdn.net/m0_539670

    2023年04月23日
    瀏覽(33)
  • 【數(shù)據(jù)庫】日常使用PL/SQL 登錄ORACLE 數(shù)據(jù)庫查詢數(shù)據(jù)

    一、PL/SQL 登錄方式 username: ##訪問數(shù)據(jù)庫的賬號 password: ##訪問數(shù)據(jù)庫的密碼 Databse: ##數(shù)據(jù)庫IP地址/實例名 數(shù)據(jù)庫集群心跳地址/實例名 Connect as : ##Normal,如果使用sysdba賬戶登錄選擇SYSDBA 二、PL/SQL使用SQL語句查詢 點擊上方導航欄,New,選擇SQL Window,即可再次輸入要查詢的

    2024年02月19日
    瀏覽(30)
  • 數(shù)據(jù)庫 SQL高級查詢語句:聚合查詢,多表查詢,連接查詢

    數(shù)據(jù)庫 SQL高級查詢語句:聚合查詢,多表查詢,連接查詢

    創(chuàng)建Students和Courses表 直接查詢 設置別名查詢 設置條件查詢 使用COUNT(*) 和 COUNT(StudentID)是一樣的效果,因為StudentID是主鍵,每行記錄的主鍵都不同。另外我們在聚合查詢中還是能使用WHERE子句的,比如我們要 查找年齡大于20歲的學生數(shù)量 ,可使用以下SQL語句: 函數(shù) 說明 SUM

    2024年02月09日
    瀏覽(104)
  • 《數(shù)據(jù)庫原理》實驗六 SQL數(shù)據(jù)查詢實驗

    《數(shù)據(jù)庫原理》實驗六 SQL數(shù)據(jù)查詢實驗

    本系列傳送門: 實驗二 SQL Server SSMS工具創(chuàng)建和管理數(shù)據(jù)庫及數(shù)據(jù)表 實驗三 SQL Server SSMS工具添加數(shù)據(jù) 實驗四 SQL的數(shù)據(jù)定義語句 實驗五 數(shù)據(jù)庫完整性約束的實現(xiàn)與驗證 實驗六 SQL數(shù)據(jù)查詢實驗 實驗六(2) SQL數(shù)據(jù)查詢—連接查詢 實驗七 SQL的數(shù)據(jù)更新和視圖 實驗八 T_SQL編程

    2024年02月03日
    瀏覽(22)
  • SQL Server數(shù)據(jù)庫 -- 表的基礎查詢

    SQL Server數(shù)據(jù)庫 -- 表的基礎查詢

    一、單表查詢基本結構 二、單表查詢結構語法 select 聚合函數(shù) where 模糊查詢 order by group by having 三、多表查詢基本結構 四、多表查詢結構語法 內連接 自連接 外連接 五、總結 ? ? ? ? 學習了數(shù)據(jù)庫,在以后公司等地方,你可能不會用到創(chuàng)建數(shù)據(jù)庫或者表格,但是你一定會使

    2024年02月11日
    瀏覽(101)
  • SQL數(shù)據(jù)庫的查詢操作大全(select)

    SQL數(shù)據(jù)庫的查詢操作大全(select)

    1、數(shù)據(jù)庫的連接、創(chuàng)建 2、對字段的操作:(alter table) 3、對數(shù)據(jù)的操作(插入、修改、刪除) 4、數(shù)據(jù)查詢(select) 5、多表查詢(join on) 6、約束操作 四、數(shù)據(jù)庫查詢大全(select) 1、select 字段名 from 表; 2、In查詢:用于 過濾 你所需要查詢的內容 ???????????????

    2023年04月08日
    瀏覽(20)
  • WordPress必備數(shù)據(jù)庫SQL查詢語句整理

    最近明月給博客和主站都部署了SSL證書,徹徹底底的加入了HTTPS站點行列。這個期間也用到了SQL查詢語句來批量的對內鏈的HTTP前綴做替換,就感覺掌握一些SQL方面的語句還是非常有必要的,這不在【俄語譯客】博客上就發(fā)現(xiàn)了幾條比較實用的,適合 WordPress 實用的SQL語句。于

    2024年02月01日
    瀏覽(39)
  • SQL Server數(shù)據(jù)庫 -- 表的高級查詢

    SQL Server數(shù)據(jù)庫 -- 表的高級查詢

    ? 一、子查詢 嵌套子查詢 相關子查詢 二、查詢運算 并運算union 交運算intersect 差運算except 三、函數(shù)的使用 if語句 while語句 case語句 四、總結 高級子查詢是對查詢更靈活的運用,學會了高級查詢將對數(shù)據(jù)庫使用有很大的幫助。 ? ? ? 在SQL語言中,一個select-from-where語句稱為一

    2024年02月13日
    瀏覽(91)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包