mybatis使用流式查詢避免查詢大批量數據導致OOM內存溢出


Mybatis提供了一般查詢和流式查詢模式,先說一下怎么配置

1、一般查詢

 

 

2、流式查詢

 

 測試場景

mysql中循環插入100,000條數據

IDEA運行時堆內存設置為初始分配堆內存20m,最大堆內存30m。如下

 

 

先使用一般查詢測試:

 

 

可以發現這里GC占用大量時間為了釋放很小的空間,這是一種保護機制。由於堆內存太小,導致需要頻繁的GC垃圾回收。官方給出的解釋:超過98%的時間用來做GC並且回收了不到2%的堆內存時拋出的異常。

大概意思就是Mybatis一次性將所有的數據查出,放到當前JVM的堆內存中,堆內存不夠用了

再來看看流式查詢是什么結果

 

 OK,程序運行正常,沒有發生OOM。

可見大批量數據用流式查詢確實能防止OOM的發生

但是,原理是什么呢?

可以看到Mapper文件中配置參數有一個

resultSetType="FORWARD_ONLY"

我們在訪問數據庫的時候,在讀取返回結果的時候,可能要前后移動指針,比如我們先計算有多少條信息,這是我們就需要把指針移到最后來計算,然后再把指針移到最前面,逐條讀取,有時我們只需要逐條讀取就可以了。還有就是有只我們只需要讀取數據,為了不破壞數據,我們可采用只讀模式,有時我們需要望數據庫里添加記錄,這是我們就要采用可更新數據庫的模式。

對於DB層,三種查詢模式的參數如下所示

ResultSet.TYPE_FORWORD_ONLY 結果集的游標只能向下滾動。 

ResultSet. TYPE_SCROLL_INSENSITIVE 結果集的游標可以上下移動,當數據庫變化時,當前結果集不變。 

ResultSet.TYPE_SCROLL_SENSITIVE 返回可滾動的結果集,當數據庫變化時,當前結果集同步改變。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM