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