MySQL中流式查詢使用

一舷夺、前言

MySQL 是目前使用比較廣泛的關(guān)系型數(shù)據(jù)庫(kù),而從數(shù)據(jù)庫(kù)里面根據(jù)條件查詢數(shù)據(jù)到內(nèi)存的情況想必大家在日常項(xiàng)目實(shí)踐中都有使用箱熬。

當(dāng)指定條件的數(shù)據(jù)量特別大時(shí)候一般是通過(guò)分頁(yè)的方式在前端頁(yè)面通過(guò) Tag 標(biāo)簽一頁(yè)頁(yè)的加載數(shù)據(jù)到內(nèi)存吭狡;但是有些情況下卻不需要用戶切換 Tag 標(biāo)簽的方式一頁(yè)頁(yè)的加載數(shù)據(jù),這時(shí)候如果一下子全部把數(shù)據(jù)加載內(nèi)存攘宙,就有可能會(huì)導(dǎo)致 OOM屯耸,雖然這時(shí)候可以通過(guò)程序控制分頁(yè)查詢,但是每次查詢時(shí)候數(shù)據(jù)庫(kù)都需要把所有符合條件的數(shù)據(jù)查詢出來(lái)然后根據(jù)當(dāng)前頁(yè)的返回來(lái)返回指定的頁(yè)蹭劈,這無(wú)疑加重了 MySQL 服務(wù)器不必要的開(kāi)銷疗绣。

其實(shí)在 MySQL 中提供了流式查詢,這允許把符合條件的數(shù)據(jù)一部分一部分的加載到內(nèi)存铺韧,本 Chat 就來(lái)具體講解如何在 MySQL中使用流式查詢:

  • 使用流式查詢前多矮,我們是如何在 MySQL 中進(jìn)行查詢數(shù)據(jù)的,整個(gè)過(guò)程發(fā)生了什么?
  • 如何使用 JDBC 編程方式在 MySQL 中使用流式查詢塔逃?

二讯壶、普通查詢

image.png
  • 當(dāng)我們?cè)贘VM進(jìn)程里面的某一個(gè)線程里面執(zhí)行數(shù)據(jù)庫(kù)查詢時(shí)候,其實(shí)這個(gè)請(qǐng)求首先會(huì)調(diào)用mysql驅(qū)動(dòng)程序湾盗。
  • mysql驅(qū)動(dòng)接受到請(qǐng)求后會(huì)向MySQL服務(wù)器發(fā)起TCP請(qǐng)求伏蚊,服務(wù)器端根據(jù)條件查詢出匹配的數(shù)據(jù),然后通過(guò)TCP鏈接發(fā)送到MySQL驅(qū)動(dòng)
  • MySQL驅(qū)動(dòng)內(nèi)則會(huì)把符合條件的數(shù)據(jù)緩存到驅(qū)動(dòng)內(nèi)格粪,等服務(wù)器返回了所有符合條件的數(shù)據(jù)后躏吊,在一下子把緩存里面的數(shù)據(jù)返回給調(diào)用sql的應(yīng)用程序。

所以如果查詢的數(shù)據(jù)量特別大帐萎,那么mysql驅(qū)動(dòng)內(nèi)緩存就可能把內(nèi)存撐爆造成OOM比伏。

三、JDBC編程中MySQL流式查詢

mysql客戶端流式查詢不會(huì)一下子把服務(wù)器端所有數(shù)據(jù)緩存起來(lái)疆导,而是一部分一部分的把服務(wù)器端返回的數(shù)據(jù)返回給應(yīng)用程序?qū)恿尴睿钥梢杂行П苊釵OM。

JDBC編程中MYSQL流式查詢例子:

public void selectData(String sqlCmd,) throws SQLException {

    validate(sqlCmd);

    Connection conn = null;
    PreparedStatement stmt = null;
    ResultSet rs = null;

    try {

        conn = petadataSource.getConnection();
        
        stmt = conn.prepareStatement(sqlCmd, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
            stmt.setFetchSize(Integer.MIN_VALUE);
            
        rs = stmt.executeQuery();

        try {
            while(rs.next()){
                try {
                    System.out.println("one:" + rs.getString(1) + "two:" + rs.getString(2) + "thrid:" + rs.getString(3));
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        } finally {
            close(stmt, rs, conn);

        }
}

可知只是prepareStatement時(shí)候改變了參數(shù)為ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY澈段,并且設(shè)置了PreparedStatement的fetchsize為Integer.MIN_VALUE悠菜。

四、最后

上面我們講解了JDBC中流式查詢使用均蜜,那么如下在Mybatis中使用那李剖?

  • 如何在 Mybatis 中使用 MyBatisCursorItemReader 進(jìn)行流式查詢?
  • 如何在 Mybatis 中使用 ResultHandler 進(jìn)行流式查詢囤耳?
  • 什么是客戶端流式查詢和服務(wù)器端流式查詢篙顺?
    更多流式查詢請(qǐng)單擊 單擊我

我的博客即將搬運(yùn)同步至騰訊云+社區(qū),邀請(qǐng)大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=25hh8jpv4h34s

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末充择,一起剝皮案震驚了整個(gè)濱河市德玫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌椎麦,老刑警劉巖宰僧,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異观挎,居然都是意外死亡琴儿,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門嘁捷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)造成,“玉大人,你說(shuō)我怎么就攤上這事雄嚣∩故海” “怎么了喘蟆?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)鼓鲁。 經(jīng)常有香客問(wèn)我蕴轨,道長(zhǎng),這世上最難降的妖魔是什么骇吭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任橙弱,我火速辦了婚禮,結(jié)果婚禮上绵跷,老公的妹妹穿的比我還像新娘膘螟。我一直安慰自己,他們只是感情好碾局,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著奴艾,像睡著了一般净当。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蕴潦,一...
    開(kāi)封第一講書(shū)人閱讀 52,785評(píng)論 1 314
  • 那天像啼,我揣著相機(jī)與錄音,去河邊找鬼潭苞。 笑死忽冻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的此疹。 我是一名探鬼主播僧诚,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蝗碎!你這毒婦竟也來(lái)了湖笨?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蹦骑,失蹤者是張志新(化名)和其女友劉穎慈省,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體眠菇,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡边败,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捎废。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笑窜。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖缕坎,靈堂內(nèi)的尸體忽然破棺而出怖侦,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布匾寝,位于F島的核電站搬葬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏艳悔。R本人自食惡果不足惜急凰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望猜年。 院中可真熱鬧抡锈,春花似錦、人聲如沸乔外。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)杨幼。三九已至撇簿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間差购,已是汗流浹背四瘫。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留欲逃,地道東北人找蜜。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像稳析,于是被迫代替她去往敵國(guó)和親洗做。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,953評(píng)論 2 89
  • 一迈着、MySQL架構(gòu)與歷史 A.并發(fā)控制 1.共享鎖(shared lock竭望,讀鎖):共享的,相互不阻塞的 2.排他...
    ZyBlog閱讀 19,844評(píng)論 3 177
  • MYSQL 基礎(chǔ)知識(shí) 1 MySQL數(shù)據(jù)庫(kù)概要 2 簡(jiǎn)單MySQL環(huán)境 3 數(shù)據(jù)的存儲(chǔ)和獲取 4 MySQL基本操...
    Kingtester閱讀 7,820評(píng)論 5 116
  • 嗩吶為去世的老人吹 這雨在我眼睛里 清亮 我想聽(tīng)別人給我講一系列故事 在離我足夠遙遠(yuǎn)的世界里 那里發(fā)生的精彩往事 ...
    翔于閱讀 259評(píng)論 0 5
  • 十一月裕菠,沒(méi)有了夏天的炎熱咬清,冬天的寒冷將至未至。終于完成江南一游的心愿奴潘。 從古詩(shī)詞中認(rèn)識(shí)的江南印象是溫柔似水旧烧,亦是繾...
    墨呆閱讀 380評(píng)論 0 0