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 返回可滾動的結果集,當數據庫變化時,當前結果集同步改變。