精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java千萬級別數據生成文件思路和優化

開發 后端
程序剛開始設計的時候說的是最多百萬級別數據,最多50W數據生成到一個xml文件里面去,所以在做測試的時候自己也只是造了100W的數據并沒有做過多數據量的測試,然后問題就來了....

一年前寫過一個百萬級別數據庫數據生成配置xml文件的程序,程序目的是用來把數據庫里面的數據生成xml文件.程序可以配置多少文件生成到一個文件中去。

程序剛開始設計的時候說的是最多百萬級別數據,最多50W數據生成到一個xml文件里面去,所以在做測試的時候自己也只是造了100W的數據并沒有做過多數據量的測試,然后問題就來了....由于程序使用的局點數據量巨大,需要生成xml文件的客戶資料接近千萬級別的程度,而現場對程序的配置大約是100W條數據生成一個xml文件里面去,程序在這樣的大數據量下面偶爾會有崩潰。

最近幾天現場催的比較緊,最近抽空把這個問題處理了一下,在解決問題的過程中我把解決的步驟和方法記錄了下來,正好和大家共享一下。

 

現場提的問題概況:

數據量:生成xml,每個文件100W+ 條的數據

內存控制:最好不要超過512M

問題詳情:在處理70W左右的時候內存溢出

一、先來看一下程序要生成的xml文件的結構

  1. <File>  
  2.   <FileType>1</FileType>  
  3.   <RType>12</RType>  
  4.   <Version>03</Version>  
  5.   <BNo>004</BNo>  
  6.   <FileQ>5</FileQ>  
  7.   <FNo>0006</FNo>  
  8.   <RecordNum>1000000</RecordNum>  
  9.   <!-- 上面是文件頭  下面是百萬個<RecordList>  -->  
  10.   <RecordList>  
  11.     <Msisdn>10350719507</Msisdn>  
  12.     <State>1</State>  
  13.     <StartDate>20110303</StartDate>  
  14.     <Date>20110419</Date>  
  15.     <Balance>45000</Balance>  
  16.   </RecordList>  
  17.    ...  <!-- 可能百萬個  <RecordList> 塊-->  
  18.  </File> 

二、給大家說一下如何把大數據生成xml文件

 

1、小數據量的情況下 < 1W條數據

比較好用的方法是使用開源框架,比如XStream 直接把javabean 生成 xml

優點:api操作簡單,方便維護

缺點:數據量大的情況下太消耗內存

2、大數據量生成一個xml文件(本程序采用的方法)

自己做的一個可以使用極少的內存生成無限制大的xml文件框架由3部分生成xml文件

第一部分:生成文件頭

例如: xxx.toXML(Object obj, String fileName)

第二部分:通過每次向文件里面追加3000(可配置)條數據的形式生成文件塊

例如:xxx.appendXML(Object object); //object 可以是ArrayList 或者一個單獨的javaBean

第三部分:生成xml文件尾巴

例如:xxx.finishXML();

 

程序中的調用:調用xxx.toXML(Object obj, String fileName) 生成文件頭之后,可以循環從數據庫中讀取數據生成ArrayList,通過xxx.appendXML(Object object) 方法追加到xml文件里面,xxx.finishXML() 對文件進行收尾

對框架說明:我上面提供的例子有文件頭 + 文件塊 + 文件尾巴. 如果和你們的實際使用文件不太一致的話,可以參考上面提供的思路修改一下即可,主要的方法是把相同的文件塊部分分離出來通過追加的形式寫入xml文件.

有了思路之后,大家可以嘗試著自己寫一個類似的大數據處理框架(千萬級別以上),如何有什么需要幫助的可以直接聯系我,因為是公司的程序,不太敢放出來,怕......

 

三、我是如何測試性能和優化的

1、手動排除

根據文件崩潰時候的日志發現是在生成xml的框架里面報的錯誤,第一想到的是框架有些資源沒有釋放.于是把自己做的文件生成框架整體的排查了一遍,并且自己寫個簡單程序生成200萬條數據,使用xml框架生成一個xml文件,整個生成過程中任務管理器(xp)查看程序對應的java進程使用的內存基本在20M左右,因此排除框架的問題.懷疑是數據庫查詢和調用框架的部門出現問題.

檢測了一遍主程序的關鍵部分代碼,優化了一下字符串處理.手動的釋放一些對象的內存(例如:調用ArrayList.clear(),或者把對象置空等),分配512內存后運行程序,60萬數據的時候內存溢出,因為能主動釋放的對象都已經釋放掉了,還是沒有解決,果斷放棄看代碼,準備使用JProfile進行內存檢測.

2、手動排除沒有解決,借助內存分析工具JProfile進行排除

通過在數據庫中生成300W條數據,在JProfile上面多跑程序,一邊運行,一邊調用JProfile 提供的執行GC按鈕主動運行垃圾回收,運行50W數據后,通過檢測中發現 java.long.String[] 和 oracle.jdbc.driver.Binder[] 兩個對象的數目一直保持在自增狀態,而且數目基本上差不多,對象數目 都在200W以上,由于java.long.String[]對象是需要依賴對象而存在的,因此斷定問題就出在oracle.jdbc.driver.Binder[]上面,由于改對象存在引用導致String[]不能正常回收.

 

3、通過在JProfile對象查看對象的管理

 

檢測到oracle.jdbc.driver.Binder 被 oracle.jdbc.driver.T4CPreparedStatement 引起,而T4CPreparedStatement正好是Oracle對jdbc OraclePreparedStatement的具體實現,因此斷定是在數據庫處理方面出現的問題導致oracle.jdbc.driver.Binder對象不能正常釋放,通過再一次有目的的檢測代碼,排查jdbc數據查詢的問題,把問題的矛頭直至數據庫的批處理和事務處理.因此程序是每生成一個文件成功后,會把已經處理的數據轉移到對應的歷史表中進行備份,而再個表操作的過程中使用了批處理和事務,使用批處理主要是保證執行速度,使用事務主要是保證同時成功和失敗。

4、又因此程序每次從數據庫中查詢3000條數據處理,所以準備監控oracle.jdbc.driver.Binder的對象數目是否和查詢次數對應.,通過在程序中Sysout輸出查詢次數 + JProfile運行GC測試 Binder,數據匹配,證實是java在數據庫批處理的過程中有些問題.

5、專門把批處理代碼提取出來通過JProfile內存分析.最終問題定位完畢.

 

原因如下:100W數據生成一個文件的過程中,等文件生成完畢之后才能把數據庫中的數據備份到歷史表中,這個時候才能進行事務的提交,也就是執行commit(), 并且刪除原表數據,100W數據按照3000一批寫入文件,每批次只是通過 PreparedStatement.addBatch();加入到批次里面去,并沒有執行PreparedStatement.executeBatch(),而是在commit()之前統一調用的PreparedStatement.executeBatch(),這樣的話PreparedStatement就會緩存100W條數據信息,造成了內存溢出.

錯誤的方法如下:

  1. try{  
  2.             conn.setAutoCommit(false);  
  3.             pst = conn.prepareStatement(insertSql);  
  4.             pstDel = conn.prepareStatement(delSql);  
  5.             pstUpdate = conn.prepareStatement(sql);  
  6.             ...   
  7.             //totalSize = 100W數據 / 3000一批次  
  8.             for (int i = 1; i <= totalSize; i++) {  
  9.                   
  10.                 client.appendXML(list);  
  11.                  
  12.             }  
  13.             // 錯誤的使用方法  
  14.             client.finishXML();  
  15.             pst.executeBatch();  
  16.             pstDel.executeBatch();  
  17.         }  
  18.          ...  
  19.         finally {  
  20.             try {  
  21.                 if (isError) {  
  22.                     conn.rollback();  
  23.                 }  
  24.                 else 
  25.                     conn.commit();  
  26.                ...  
  27.             }  
  28.           ...  
  29.         } 

正確的方法如下

  1. try{            
  2.   conn.setAutoCommit(false);  
  3.             pst = conn.prepareStatement(insertSql);  
  4.             pstDel = conn.prepareStatement(delSql);  
  5.             pstUpdate = conn.prepareStatement(sql);  
  6.             ...   
  7.             //totalSize = 100W數據 / 3000一批次  
  8.             for (int i = 1; i <= totalSize; i++) {  
  9.                 list = 從數據庫中查詢3000條數據  
  10.                 client.appendXML(list);  
  11.  
  12.                pst.executeBatch();  
  13.                pstDel.executeBatch();  
  14.             }  
  15.             client.finishXML();  
  16.               
  17.         }  
  18.          ...  
  19.         finally {  
  20.             try {  
  21.                 if (isError) {  
  22.                     conn.rollback();  
  23.                 }  
  24.                 else 
  25.                     conn.commit();  
  26.                ...  
  27.             }  
  28.           ...  
  29.         } 

如果碰到和我一樣的需要給大家一個提醒。

oracle在每次執行executeBatch();進行批處理的時候,當前connection對應的rownum會根據操作的結果發生變化。

在執行pst.executeBatch(); 之后,當前連接的 rownum 數就會發生變化. 因此凡是通過rownum查詢數據的程序都要小心這一點

下一篇將整理寫java大數據(千萬級別以上的)處理,包括 ftp大數據處理、文件生成大數據處理、數據庫轉移大數據處理、文件讀取大數據處理等等。

原文鏈接:http://www.cnblogs.com/dyllove98/archive/2012/04/24/2468771.html

【編輯推薦】

  1. Java圖形界面開發:高級Swing容器(一)
  2. Java圖形用戶界面:高級組件綜合例子
  3. Java程序員應該遵循的10條戒律
  4. Java核心類庫:內部類那點事兒
  5. 在Java程序中調用Matlab函數
責任編輯:林師授 來源: jlins的博客
相關推薦

2020-08-06 08:00:51

數據分頁優化

2022-09-01 08:42:36

SQL數據項目

2024-02-05 13:28:00

Excel優化服務器

2023-06-29 08:22:43

數據Excel模板

2023-02-24 16:37:04

MySQL數據查詢數據庫

2013-09-10 10:20:12

數據大數據大數據應用

2020-09-01 17:19:36

數據監控建模

2009-12-28 16:10:38

WPF生成文件

2023-12-07 07:46:21

MySQL寫入點LSN

2022-08-31 12:57:58

PythonTemplate文件報告

2019-05-22 15:57:11

面試ES性能數據

2012-03-01 15:06:58

2013-02-27 15:48:05

自動化備份FacebookPB級別數據庫

2012-08-06 14:02:09

萬國數據數據中心GDS

2022-07-05 21:31:21

索引SQL分庫分表

2018-07-11 20:07:06

數據庫MySQL索引優化

2024-07-22 11:48:42

2011-11-08 13:46:44

靜態文件Nginx優化

2020-07-08 13:46:25

Python數據分析預處理

2023-12-29 08:12:58

Explain索引SQL優化
點贊
收藏

51CTO技術棧公眾號

日韩欧美精品在线视频| 99视频国产精品免费观看a| 天堂资源中文在线| 日本国产亚洲| 激情欧美日韩一区| 欧美中文字幕久久| 美国三级日本三级久久99| 91麻豆国产福利精品| 中文字幕久久久| 日韩a∨精品日韩在线观看| 一级黄色大片免费观看| 亚洲伦理久久| 国产日韩综合av| 欧美亚洲国产精品| 久久久无码人妻精品无码| 91官网在线| 日韩和欧美一区二区三区| 日韩欧美高清在线| 成人黄色片视频| 色欲av伊人久久大香线蕉影院| 天天影视天天精品| 欧美色图片你懂的| 亚洲激情一区二区三区| 久久久久久不卡| a看欧美黄色女同性恋| 中文字幕视频一区| 国产精品爽爽爽爽爽爽在线观看| wwwwxxxx国产| 日韩大片欧美大片| 久久人人超碰精品| 日韩av观看网址| 亚洲精品国产精品国自产网站| 345成人影院| 久久久久久久精| 国产精品1区2区在线观看| 瑟瑟视频在线观看| aaa国产精品| 欧美一级午夜免费电影| 男女激烈动态图| 一级α片免费看刺激高潮视频| 亚洲一区视频| 在线观看日韩欧美| 在线观看国产中文字幕| 国产网友自拍视频导航网站在线观看| 视频一区二区欧美| 久久精品成人欧美大片古装| 天天干天天色天天干| 日本色护士高潮视频在线观看| 成人一级黄色片| 69视频在线免费观看| 欧美黄色一级生活片| 亚洲精品aaa| 欧美视频在线一区二区三区 | 久久久久久久久久久久电影| 亚洲美女屁股眼交3| 国产精品污www一区二区三区| 毛片a片免费观看| 欧美调教在线| 欧美日韩性生活| 91热这里只有精品| 美女羞羞视频在线观看| 成人国产在线观看| 国产精品一区二区性色av| 男人的天堂av网站| 午夜日韩福利| 亚洲精品视频二区| 欧美美女性视频| bl在线肉h视频大尺度| 久久综合五月天婷婷伊人| 激情欧美一区二区三区中文字幕| 不卡av电影院| 成人手机视频在线| 好男人在线视频www| 一本久道久久综合婷婷鲸鱼| 伊人久久久久久久久久| 亚洲精品成人无码| 色喇叭免费久久综合| 亚洲成年人影院在线| 成人中文字幕av| 在线观看午夜av| 久久蜜桃一区二区| 色一情一乱一伦一区二区三区| 国产成人精品无码高潮| 国产凹凸在线观看一区二区| 国产精品大片wwwwww| 日韩成人免费在线观看| 日韩成人三级| 欧美成人亚洲成人| 综合 欧美 亚洲日本| 99re6热只有精品免费观看| 亚洲福利视频网站| 国产免费一区二区三区网站免费| 久久亚洲在线| 国产一区二区三区在线| 欧美成人三级伦在线观看| 91丨精品丨国产| 欧美成人三级在线| 精品亚洲男同gayvideo网站| 国产精品日韩三级| 国产在线观看黄| 播五月开心婷婷综合| 精品国产一区二区三区四区精华 | 中国日韩欧美久久久久久久久| 欧美成人777| 狠狠色丁香婷婷综合影院| 亚洲成人黄色网| 国产又粗又硬视频| 国产精品探花在线观看| 久久久91精品| 秋霞精品一区二区三区| 国产精品自在在线| 成人h视频在线| 中文字幕一区二区人妻痴汉电车 | www.精品在线| 久久97精品| 日韩欧美一卡二卡| 日本少妇高潮喷水xxxxxxx| 欧美.www| 国产精选久久久久久| 亚洲人成色777777精品音频| 成人高清视频在线观看| 亚洲精品一区二区三区av| zzzwww在线看片免费| 亚洲一区二区三区小说| 中国一区二区三区| 国产在线高清视频| 日本高清无吗v一区| 亚洲狼人综合干| 风间由美性色一区二区三区四区 | 亚洲精品成人无码毛片| 久久一区91| 日韩av第一页| 亚洲女人18毛片水真多| 亚洲欧美综合色| 精品久久人人做人人爱| 久久国产色av免费观看| 亚洲深夜视频| 91久久国产最好的精华液| 国产成人精品一区二区在线小狼| 久久精品国产www456c0m| 欧美在线影院在线视频| 日韩精选在线观看| www一区二区| 亚洲熟妇av一区二区三区漫画| 欧美xoxoxo| 日韩av综合中文字幕| 国产伦理片在线观看| 制服诱惑一区二区| 国产亚洲情侣一区二区无| 久久久久国产精品嫩草影院| 国产欧美视频在线观看| 法国空姐在线观看免费| 久草综合在线| 欧美精品一区二区久久久| 免费观看av网站| 成人羞羞网站入口| 九九热精品视频| 日韩特黄一级片| 蜜臀精品久久久久久蜜臀| 91精品久久久久久蜜桃| 亚洲色图另类小说| 五月天国产精品| www.精品在线| 欧美3p在线观看| 91色视频在线观看| 三级在线播放| 国产精品不卡在线观看| 男人添女荫道口图片| 粉嫩av一区二区三区四区五区| 日韩三级电影网址| 18禁裸乳无遮挡啪啪无码免费| 亚洲一区国产| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 一区不卡在线观看| 国产精品美女视频| 成人污网站在线观看| 国产精品高颜值在线观看| 亚洲精品电影在线观看| 成人做爰视频网站| 午夜亚洲激情| 日韩激情视频| 青青草原av在线| 欧美亚洲动漫另类| 91麻豆精品久久毛片一级| 在线亚洲成人| 五码日韩精品一区二区三区视频| 97精品资源在线观看| 欧美精品videos另类日本| 91成品人影院| 亚洲一级片在线观看| 亚洲AV无码国产精品| 国内精品久久久久久久影视蜜臀| 国产精品成人播放| 黄色成人影院| 亚洲精品国产精品国自产在线 | 另类综合日韩欧美亚洲| 欧美在线观看黄| 欧美激情在线精品一区二区三区| 欧美大片在线看| 国产免费高清av| 国产女主播一区| 久久出品必属精品| 999国产精品永久免费视频app| 99re在线国产| 日本孕妇大胆孕交无码| 亚洲欧美制服第一页| 国产99久久久| 97久久精品人人做人人爽50路 | av网站在线免费看推荐| 日韩精品在线视频| 国产精品怡红院| 国产精品福利一区| 人妻无码中文久久久久专区| 精品一区二区免费看| 制服诱惑一区| 亚洲精品一级二级三级| 欧美亚洲视频在线看网址| 黄色片网站在线| 色老太综合网| 亚洲天堂视频在线观看| 亚洲av综合色区无码一二三区| 中文字幕视频一区二区三区久| 特级西西人体4444xxxx| 国产一区二区三区视频在线播放| 一区二区在线观| 羞羞答答一区二区| 国产国产精品人在线视| 国产在线拍揄自揄拍视频| 精品成人免费观看| 国产精品国产精品国产专区| 色综合天天综合给合国产| 精品人妻互换一区二区三区| 国产91精品一区二区| 在线能看的av网站| 视频在线观看国产精品| 欧美日韩黄色一级片| 亚洲午夜一级| 粉嫩av一区二区三区天美传媒 | 一区二区三区四区不卡| 97精品资源在线观看| 国产精品久久久久久久久免费看| av电影在线网| 亚洲石原莉奈一区二区在线观看| 日本免费网站在线观看| 色八戒一区二区三区| 日韩三级视频在线播放| 亚洲国产va精品久久久不卡综合| 男女黄床上色视频| 99riav久久精品riav| 免费看毛片的网站| 日本亚洲天堂网| 日本精品免费视频| 图片区亚洲欧美小说区| 中文字幕中文字幕99| 99九九热只有国产精品| 在线视频精品一区| 久久精品久久久| 久久av免费观看| 97欧美成人| 国产精品视频导航| 未满十八勿进黄网站一区不卡| 国产中文日韩欧美| 欧美日韩另类在线| 亚洲免费不卡| 精品亚洲成人| 风间由美久久久| 日本免费久久| 国产精品电影观看| 成人自拍视频网| 午夜免费在线观看精品视频| 在线观看国产原创自拍视频| 最新日韩中文字幕| 天堂中文在线视频| 亚洲男人天堂网站| 亚洲成人第一区| 亚洲激情国产精品| 国产中文字幕在线看| 日韩在线视频网| 污视频在线看网站| 91精品91久久久久久| 亚洲精品国产嫩草在线观看| 国精产品一区一区三区有限在线| 午夜视频在线看| 亚洲人成电影网站色…| 在线视频婷婷| 欧美激情第1页| 日韩久久一区二区三区| 成人免费淫片视频软件| 国产精品久av福利在线观看| 国产欧美日韩一区二区三区| 欧美精选一区二区三区| 国产激情片在线观看| 美日韩精品视频| 波多野结衣综合网| 日韩国产成人精品| 天天爽夜夜爽视频| 激情综合一区二区三区| 天堂av在线网站| 国产精品影视天天线| 日韩人妻一区二区三区| 亚洲精品视频自拍| 无码人妻一区二区三区线| 精品久久久香蕉免费精品视频| 免费在线观看av的网站| 日本久久精品电影| 国产老妇伦国产熟女老妇视频| 亚洲aⅴ网站| 国产成人综合久久| 日韩一区二区三区精品| 成人www视频在线观看| 卡一精品卡二卡三网站乱码| 在线观看成人一级片| 亚洲一区成人| 超级砰砰砰97免费观看最新一期| 精品一区二区三区在线观看国产 | 69精品国产久热在线观看| 亚洲a在线播放| 国产日产精品_国产精品毛片| 蜜臀av.com| 欧美aaaaa成人免费观看视频| 中文字幕在线永久| 亚洲蜜臀av乱码久久精品| 97人妻精品视频一区| 亚洲精品黄网在线观看| 1区2区3区在线视频| 国产精品香蕉在线观看| 西野翔中文久久精品字幕| 日本中文字幕在线视频观看| 欧美日韩国产成人精品| 激情五月六月婷婷| 麻豆精品一区二区| 偷拍夫妻性生活| 岛国av在线不卡| 天堂中文在线资源| 久久99亚洲精品| 视频一区日韩精品| 无码人妻精品一区二区三区99v| 美女视频免费一区| 少妇愉情理伦三级| 欧美三级在线播放| 99中文字幕一区| 国产欧美日韩中文字幕| 日韩国产欧美| jizzzz日本| 日韩理论片网站| 国产在线拍揄自揄拍无码视频| 精品福利樱桃av导航| 色婷婷视频在线| 国模吧一区二区| 中文字幕在线天堂| 国产精品乱码一区二三区小蝌蚪| 在线免费黄色av| 亚洲精品一区二区网址| 亚洲精品福利电影| 欧洲精品一区色| 国产精品久久久久蜜臀| 一本岛在线视频| 成人的网站免费观看| 老女人性淫交视频| 色婷婷精品久久二区二区蜜臂av | 亚洲狼人综合干| 亚洲国产精华液网站w| 久久久美女视频| 欧洲一区二区三区在线| 成全电影播放在线观看国语| 欧美激情极品视频| 精品丝袜久久| 精品久久久久av| 国产精品人妖ts系列视频| 97人妻人人澡人人爽人人精品| 久久av.com| 国产精品115| 日日摸天天爽天天爽视频| 国产精品丝袜91| 国产aⅴ一区二区三区| 久久6精品影院| 婷婷成人在线| 潘金莲激情呻吟欲求不满视频| 一区二区在线观看视频| 精品乱码一区内射人妻无码| 日韩中文字幕av| 岛国av在线网站| 视频一区在线免费观看| 国产精品中文字幕一区二区三区| 国产第一页第二页| 亚洲香蕉av在线一区二区三区| 91九色成人| 国模吧无码一区二区三区| 成人性生交大片免费看中文网站 | 制服丝袜亚洲网站| 国产精品四虎| 欧美在线性爱视频| 91精品天堂福利在线观看| 国产又粗又猛又色| 欧美日韩国产一区| 不卡在线视频| www.久久艹| 蜜臂av日日欢夜夜爽一区| 久久久久成人精品无码| 在线观看免费高清视频97|