//關(guān)閉線程池 pool.shutdown(); try { // awaitTermination返回false即超時(shí)會(huì)繼續(xù)循環(huán),返回true即線程池中的線程執(zhí)行完成主線程跳出循環(huán)往下執(zhí)行,每隔10秒循環(huán)一次 while (!pool.awaitTermination(10, TimeUnit.SECONDS)); } catch (InterruptedException e) { e.PRintStackTrace(); } 在線程池關(guān)閉之后,該方法會(huì)一直進(jìn)行檢查直到所有的線程池中的線程都執(zhí)行完畢才會(huì)繼續(xù)主線程,從而實(shí)現(xiàn)我們的要求。 將表之間進(jìn)行拆分之后,第二步就是將每張表的數(shù)據(jù)進(jìn)行查詢并進(jìn)行處理之后再寫入文件。但是單張表的數(shù)據(jù)也太大了,開始我們循環(huán)rs.next();。將沒次查詢到的數(shù)據(jù)寫入TXT并記錄數(shù)據(jù)的大小,重而拆分寫多個(gè)不同的文件。但是這個(gè)還是太慢了,因?yàn)樗械臄?shù)據(jù)處理都是串行的太慢了。 隨后我們又做了,將所有數(shù)據(jù)封裝了一個(gè)LIST并將返回的LIST拆分成十個(gè)小LIST寫成多線程的方式進(jìn)行處理,巴特,還是太年輕了。多線程中開多線程,導(dǎo)致程序中有幾百個(gè)進(jìn)程在跑,并且將內(nèi)存中的放入了幾十億的數(shù)據(jù)。很抱歉,在某家公司進(jìn)行測(cè)試的時(shí)候,64G的內(nèi)存處理一般就內(nèi)存溢出了……。所以該方案也不行。 接下來,我們就在想有沒有更高效的方法,不必將每張表的所以數(shù)據(jù)都復(fù)制進(jìn)內(nèi)存在進(jìn)行處理。而是將按多少條進(jìn)行查詢處理。一個(gè)是手工分頁查詢進(jìn)行處理。一個(gè)是加序列進(jìn)行處理。還有就是cachedrowset的方法。3.cachedrowset的使用
cachedrowset繼承自ResultSet,它是將數(shù)據(jù)庫的數(shù)據(jù)一次拷貝到內(nèi)存中,并支持分頁拷貝。在發(fā)現(xiàn)這個(gè)方案的時(shí)候才知道原來每次while(rs.next())都是與數(shù)據(jù)庫的鏈接光標(biāo)取下一行,原來自己的認(rèn)知是將所有都加載到內(nèi)存,看來還是自己太年輕了。cachedrowset是將數(shù)據(jù)復(fù)制到內(nèi)存,它提供了一個(gè)分頁方法setPageSize(size); 可以設(shè)置每頁讀取的數(shù)據(jù)數(shù)量并加載到內(nèi)存,同理while(crs.nextpage()) 是取下一頁。所以,我們將數(shù)據(jù)的邏輯放到了while里,不能直接將crs傳入到多線程里進(jìn)行處理,不然在進(jìn)行字段數(shù)據(jù)獲取的時(shí)候會(huì)報(bào)錯(cuò)。cachedrowset.createCopy()這個(gè)方法可以幫我們復(fù)制一份這個(gè)對(duì)象。我們可以將這個(gè)對(duì)象傳入到線程池中進(jìn)行處理。哈哈,到這里是不是以為已經(jīng)可以了。答案是否定的%>_<% 在實(shí)際測(cè)試的時(shí)候發(fā)現(xiàn),每次還是將數(shù)據(jù)全部復(fù)制到了內(nèi)存。雖然線程池的線程個(gè)數(shù)有設(shè)置,但是循環(huán)每次crs.nextpage()會(huì)將復(fù)制后的對(duì)象放進(jìn)內(nèi)存中在放入線程池的隊(duì)列中……。所以我們要在循環(huán)取數(shù)的時(shí)候判斷線程池是否有空閑的在用crs.nextpage()取下一頁的數(shù)據(jù)。這樣就不會(huì)講一個(gè)表的所有數(shù)據(jù)加載到內(nèi)存了。這樣內(nèi)存中的數(shù)據(jù)量等于=線程數(shù)*每頁數(shù)量+每頁數(shù)量。這樣就可以有效的將問題分解處理了。執(zhí)行將數(shù)據(jù)查詢和業(yè)務(wù)邏輯耦合了……4.總結(jié)
通過這次問題的分析以及初步解決。感覺自己知道的東西還是有限。無論是自己的眼界和見解都還沒用達(dá)到一個(gè)程序員應(yīng)有的水平,對(duì)于不常用的東西還是知識(shí)儲(chǔ)備不足。哦對(duì)了,cachedrowset的Statement要是可滾動(dòng)的。歡迎各位可以有更好的方案,同時(shí)也隨便告訴下我這個(gè)無知的萌新。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注