java.lang.OutOfMemoryError:Java進行大數據量查詢內存溢出


1):今天進行庫存查詢,select * from  table  查詢出來的數據量只有2萬多條,卻報了內存溢出的錯誤,於是采用了分頁的方式進行讀取。

       方法之一:在連接MySQL的URL后加兩個參數:useCursorFetch=true&defaultFetchSize=100

完整形式如:jdbc:mysql://192.168.1.252:3306/lims?useUnicode=true&charsetEncoding=utf8&useCursorFetch=true&defaultFetchSize=100

此方法只針對mysql有效

       方法之二:分頁:int totalCount = parnterSV.queryPartnerInfoForDealerCount(condition.toString(), infomap);
int beginIdx=1;
int returnCount=0;
while(beginIdx<=totalCount){
IBOPartnerInfoValue[] dealers =parnterSV.queryPartnerInfoForDealer(condition.toString(), infomap,beginIdx,beginIdx+5000);
if(dealers!=null&&dealers.length>0){
returnCount=dealers.length;

beginIdx=beginIdx+returnCount

}

問題解決!!?

但是另外一條查詢select t.code  from table t 返回6萬多條語句,都沒有報內存溢出的問題。感到很奇怪。於是想了想,分頁是解決jvm垃圾回收機制運作沒有new 對象(變量) 和釋放對象的速度快導致的(虛擬機分配的到堆內存空間已經用滿了),那么2萬多條就內存溢出了,6萬多條的都沒事,是不是因為select  *的問題??     於是select  * 改成 某幾個字段,果然不報錯了。奉勸大家進行大數據查詢的時候盡量只select有用的數據。

2):在1)中,通過分頁,不斷釋放jvm內存達到優化,但是對於大數據量的多層分組是不能進行分頁的,怎么辦吶?以下別人的解答:http://blog.tianya.cn/post-3530792-31964150-1.shtml

 


免責聲明!

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



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