精品欧美一区二区三区在线观看 _久久久久国色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久久精品久久久久久ai换脸| 国产九色在线播放九色| 亚洲成人99| 亚洲精品短视频| 天天色综合社区| 激情网站在线| 国产三级一区二区| 成人综合电影| 在线观看不卡的av| 日韩一级免费| 久热爱精品视频线路一| 国产真实乱人偷精品人妻| 精品国产亚洲一区二区三区大结局| 亚洲成人中文在线| 黄色高清视频网站| 可以直接在线观看的av| 丁香六月综合激情| 成人黄色片在线| 国产一级淫片a视频免费观看| 国产精品毛片久久| 亚洲天堂网站在线观看视频| 大尺度在线观看| 爱情电影网av一区二区| 日本韩国一区二区| 国产一区二区在线视频播放| 国产黄a三级三级三级av在线看 | 九色91在线视频| 国产男男gay体育生网站| 久久综合影音| 欧美一二三视频| 国产成人精品av久久| 亚洲精品国产首次亮相| 色婷婷综合成人av| 天天干天天舔天天操| 天天操综合520| 精品国产91亚洲一区二区三区婷婷| 中文字幕一区久久| 成人四虎影院| 精品国产老师黑色丝袜高跟鞋| 亚洲精品少妇一区二区| 在线h片观看| 亚洲欧美日韩在线播放| 亚洲资源视频| 日本高清在线观看wwwww色| 国产校园另类小说区| 美日韩免费视频| 五月婷婷激情在线| 91麻豆免费在线观看| 久久国产精品免费一区| 亚洲 国产 欧美 日韩| 成人黄色大片在线观看| 国产精品久久久久久久久久久久午夜片 | 91中文在线视频| 国产精品一级视频| 国内精品伊人久久久久av一坑| 国产中文字幕亚洲| 97人妻一区二区精品免费视频| 奇米精品一区二区三区在线观看一| 国产va免费精品高清在线观看| 免费看污视频的网站| 日韩av中文字幕一区二区| 国产国语videosex另类| 国产精品51麻豆cm传媒 | 国模大尺度视频| 2023国产精华国产精品| 精品va天堂亚洲国产| 亚洲男女在线观看| 欧美**字幕| 中文字幕一区二区精品| 69av视频在线| 亚洲欧美不卡| 国产精品一区二区久久国产| a天堂在线视频| 本田岬高潮一区二区三区| 免费一区二区三区| 久操视频在线播放| 亚洲一区二区美女| 免费大片在线观看| 999精品嫩草久久久久久99| 日韩一区二区在线观看视频播放| 成人免费看片载| 九九热精品视频在线观看| 色婷婷久久一区二区| 精品午夜福利视频| 日韩国产欧美视频| 亚洲xxx自由成熟| 手机看片一区二区三区| 国产精品网友自拍| 97碰在线视频| 成人爱爱网址| 日韩一区二区免费视频| 丝袜美腿中文字幕| 亚洲高清影视| 欧美在线观看网址综合| 国产一区二区三区中文字幕| 97精品国产97久久久久久久久久久久 | 国模私拍视频在线观看| 极品一区美女高清| 久久久久www| 亚洲中文一区二区| 成人精品免费网站| 亚洲最新免费视频| 日韩欧美一区二区三区在线观看| 日韩精品一区二区三区老鸭窝| 日本xxxxxxxxx18| 亚洲精品三级| 亚洲中国色老太| 在线免费观看黄色av| 欧美日韩亚洲视频一区| 日本黄色www| 色综合狠狠操| 国产成人精品av| 亚洲 另类 春色 国产| 亚洲精品成a人| gai在线观看免费高清| 国产精品一区高清| 97碰在线观看| 免费观看黄色一级视频| 亚洲猫色日本管| 17c国产在线| 日韩一区电影| 国产成人精品电影久久久| www香蕉视频| 日韩毛片一二三区| 99免费视频观看| 欧美激情极品| 91黑丝在线观看| 国产叼嘿视频在线观看| 国产精品久久久久aaaa| 99色精品视频| 免费观看成人www动漫视频| 一区二区福利视频| 无码人妻一区二区三区免费 | 蜜臀av粉嫩av懂色av| 国产精品久久久乱弄| 日本精品久久久久久久| 性感美女福利视频| 天天综合天天做天天综合| 古装做爰无遮挡三级聊斋艳谭| 日韩av片子| 国产成人精品日本亚洲专区61| av免费在线不卡| 亚洲卡通动漫在线| 欧美国产日韩另类| 日韩精品久久久久久久电影99爱| 日韩免费中文字幕| 日韩欧美电影在线观看| 午夜精品久久久久久久久久| 天天躁日日躁狠狠躁av| 欧美性久久久| 99se婷婷在线视频观看| caopen在线视频| 日韩视频免费观看高清完整版 | 久久久久久有精品国产| 手机在线观看免费av| 亚洲aⅴ怡春院| 影音先锋资源av| 日韩午夜av| 久久99精品国产一区二区三区| 久久五月精品| 精品国产青草久久久久福利| 青青草成人免费| 国产风韵犹存在线视精品| wwwjizzjizzcom| 国产精品毛片视频| 色综合天天狠天天透天天伊人| 国产一区二区在线不卡| 亚洲精品国久久99热| 中文字幕1区2区| 国产午夜精品一区二区三区欧美 | 日本久久一级片| 狠狠色狠狠色综合日日五| 免费污网站在线观看| 日韩av网站在线观看| 亚洲人成网站在线观看播放 | 日韩免费电影一区| 国产成人免费观看视频| 久久免费电影网| 亚洲欧美激情网| 久久久久久久久国产一区| 国产亚洲福利社区| 国产综合色区在线观看| 最新中文字幕亚洲| 性色av蜜臀av| 日韩欧美在线免费观看| 国产人妻精品一区二区三区不卡| 成人免费福利片| 麻豆av免费在线| 99精品小视频| 黑人巨大精品欧美一区二区小视频| 僵尸再翻生在线观看| 久久精品视频中文字幕| 三级网站在线看| 欧美三级韩国三级日本一级| 欧美黄片一区二区三区| 91麻豆免费视频| 亚洲成人福利视频| 老司机亚洲精品| 中文字幕综合在线观看| 国产精品调教| 国产欧美久久久久久| 国产美女高潮在线观看| 综合国产在线视频| 五月婷婷狠狠干| 欧美午夜精品理论片a级按摩| 中文字幕手机在线观看| 国产拍欧美日韩视频二区 | 国产在线精品国自产拍免费| 成人免费性视频| 日韩在线理论| 国产伦精品一区二区| 狠狠久久伊人中文字幕| 91av在线国产| 91麻豆免费在线视频| 日韩福利视频在线观看| 亚洲成人一级片| 欧美精品1区2区3区| 精品国产午夜福利| 亚洲国产日韩一级| 免费91在线观看| 欧美经典三级视频一区二区三区| 国产伦精品一区三区精东| 日av在线不卡| 免费看a级黄色片| 老**午夜毛片一区二区三区 | 一区二区三区精品视频在线观看| 亚洲一区二区精品在线观看| 亚洲免费福利一区| 久久人人九九| 久久1电影院| av蓝导航精品导航| 91国产精品| 国产精品wwwwww| 日本精品在线中文字幕| 91精品国产电影| 国产探花视频在线观看| 久久视频在线直播| av网站在线播放| 正在播放欧美一区| 福利在线播放| 亚洲天堂开心观看| 韩国中文字幕2020精品| 亚洲性线免费观看视频成熟| 欧美新色视频| 亚洲欧美综合v| 欧美日韩视频精品二区| 欧美xingq一区二区| 色噜噜在线播放| 亚洲第一av网| 天天摸天天碰天天爽天天弄| 欧美sm极限捆绑bd| 天堂网在线观看视频| 亚洲成人黄色在线观看| 你懂的网站在线| 亚洲高清色综合| 亚洲 国产 欧美 日韩| 亚洲一区二区黄| 91亚洲欧美| 日韩天堂在线视频| caopen在线视频| 2018国产精品视频| 高清不卡亚洲| 国产精品久久久久久久久| 日本一区二区电影| 国产精品第二页| 日本国产亚洲| 999国内精品视频在线| 国产精品xnxxcom| 国产精品国色综合久久| 一区二区三区日本久久久| 日韩啊v在线| 三上亚洲一区二区| 99久久99久久精品| 亚洲在线网站| 亚洲国产日韩欧美在线观看| 国产一区二三区好的| 国产成人av片| 久久久久久久综合狠狠综合| 波多野结衣家庭教师在线观看| 亚洲人成网站色在线观看| 久久这里只有精品免费| 欧美日韩激情视频| 99国产精品欲| 日韩精品视频在线| 香蕉视频在线免费看| 欧美丰满少妇xxxxx做受| 国产一区一一区高清不卡| 99国产在线观看| 在线观看欧美理论a影院| 中文精品视频一区二区在线观看| 欧美+亚洲+精品+三区| 狠狠97人人婷婷五月| 久久国产精品免费| 大桥未久恸哭の女教师| 久久久九九九九| 青青草手机视频在线观看| 日韩欧美精品网站| 国产日韩在线观看一区| 亚洲成人av片在线观看| 日本精品一区二区三区在线播放| 国产做受高潮69| 日韩av黄色| 蜜桃传媒视频麻豆第一区免费观看 | 麻豆精品视频在线观看免费| 欧美午夜精品一区二区| 国产欧美精品在线观看| 久久综合加勒比| 欧美一区2区视频在线观看| 青青草av免费在线观看| 欧美人与物videos| 国外成人福利视频| 欧美高清性xxxxhd| 欧美特黄一区| 九九九九九伊人| 久久精品视频在线看| 亚洲另类欧美日韩| 精品国产一区二区三区不卡| 午夜伦全在线观看| 国产成人精品在线观看| 亚洲国产欧美日韩在线观看第一区 | 欧美污视频网站| 波多野结衣91| 青娱乐在线视频免费观看| 欧美日韩免费一区二区三区 | 成人动态视频| 青青草视频国产| 国内精品久久久久影院薰衣草 | 日韩欧美午夜| 99草草国产熟女视频在线| 99麻豆久久久国产精品免费| 四虎永久在线精品| 日韩欧美在线不卡| 成人欧美亚洲| 久久久综合免费视频| 亚洲精品黑牛一区二区三区| 日本三级福利片| 韩国成人福利片在线播放| 日本中文在线视频| 欧美日韩国产美| 超碰在线国产| 日韩免费在线播放| 水蜜桃精品av一区二区| 黄色手机在线视频| 国产精品伦一区| 国产女同91疯狂高潮互磨| 中文字幕综合在线| 国产精品第一| 亚洲图片在线观看| 狠狠色狠狠色综合系列| 在线观看天堂av| 在线不卡免费欧美| 黄色小视频在线免费观看| 欧洲杯什么时候开赛| 最新中文字幕久久| 久久99这里只有精品| 老女人性淫交视频| 精品人伦一区二区色婷婷| 69av成人| 欧美二区三区在线| 老牛嫩草一区二区三区日本| 中文字幕在线观看免费高清| 欧美三级欧美一级| 欧美日韩经典丝袜| 久久av一区二区三区亚洲| 国产日韩欧美一区| 69视频在线观看免费| 91精品久久久久久久91蜜桃 | 欧美国产日韩一区二区| 亚洲精品18| 免费日韩中文字幕| 国产精品久久久久桃色tv| 国产精品自拍电影| 久久国产精品影片| 亚洲人成网77777色在线播放| 欧美在线观看视频网站| 国产精品另类一区| 欧美熟妇交换久久久久久分类| 欧美亚洲激情视频| 日韩欧美一区二区三区在线视频| 奇米影视四色在线| 亚洲 欧美综合在线网络| 毛片在线免费| 91色精品视频在线| 爽好多水快深点欧美视频| 麻豆精品国产免费| 日韩av在线直播| 国产精品一区二区精品视频观看 | 色婷婷av在线| 看高清中日韩色视频| 久久精品国产一区二区三|