本文目錄一覽:
怎麼使用java導出大數據為xml文件
dom4j可以試試,不知道你的數據量有多大,如果太大的話,我沒試過
xml文件是有規律的,你可以把要導出的數據構造一下,
我有個簡單的代碼
package com.test.xml;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
public class Dom4JXML {
public void createXML() {
//用工廠類創建一個document實例
Document doc = DocumentHelper.createDocument();
//創建根元素emps
Element rootEle = doc.addElement(“emps”);
//添加註釋
rootEle.addComment(“這是一個dom4j生成的xml文件”);
//emps根節點下創建一個emp節點
Element empEle = rootEle.addElement(“emp”);
//emp添加屬性id=”1″
empEle.addAttribute(“id”, “1”);
//emp節點下創建一個name節點
Element nameEle = empEle.addElement(“name”);
//name節點下創建一個文本節點zhangsan
nameEle.setText(“zhangsan”);
//再為name節點創建一個兄弟節點
Element sexEle = empEle.addElement(“sex”);
sexEle.setText(“man”);
//將document中的內容寫入文件中
try {
Writer out = new FileWriter(“F:\\emps.xml”);
//格式化輸出,類型IE瀏覽一樣
OutputFormat format = OutputFormat.createPrettyPrint();
//OutputFormat format = OutputFormat.createCompactFormat();
format.setEncoding(“UTF-8”);
//創建寫出對象
XMLWriter writer = new XMLWriter(out,format);
writer.write(doc);
writer.close();
System.out.println(“生成emps.xml成功。”);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println(“失敗了。”);
}
}
public static void main(String[] args) {
new Dom4JXML().createXML();
}
}
然而從xml文件中解析以後的數據收集可以用SAX試試看
我這裡有個簡單的例子
package com.test.xml;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SAXParseHandler extends DefaultHandler{
public void startDocument()throws SAXException{
System.out.println(“起始文擋”);
}
public void endDocument()throws SAXException{
System.out.println(“結束文擋”);
}
public void characters(char[] ch,int start,int length)throws SAXException{
String charString=new String(ch,start,length);
System.out.println(“字元:”+charString);
}
public void startElement(String namespaceURI,String localName,String qName,Attributes atts)throws SAXException{
System.out.println(“起始元素:”+qName);
for(int i=0;iatts.getLength();i++){
System.out.println(“屬性值:”+atts.getValue(i));
}
}
public void endElement(String namespaceURI,String localName,String qName)throws SAXException{
System.out.println(“結束元素:”+qName);
}
}
package com.test.xml;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class Books {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
// TODO 自動生成方法存根
SAXParserFactory factory=SAXParserFactory.newInstance();
SAXParser parser=factory.newSAXParser();
parser.parse(“booksamp.xml”,new SAXParseHandler());
}
}
Java 大數據量導出,該怎麼解決
對於數據規模太大的,做成任務。
用戶點擊導出,檢查他的數據規模,超過50W的,提示其數據規模過大,可能需要 N 小時完成,請稍候再來查詢和下載導出結果。如果用戶點擊確定,你就提示:「任務已進入隊列,點擊此連接查詢導出進度。」
然後你要做兩件事情:
1、給這個用戶記錄個標識,就是他已經啟動某導出任務,不能再啟動新的了(或者限制一個人最多同時啟動幾個導出任務);
2、後台有個調度程序,開始執行導出工作,並將生成的Excel放在某磁碟目錄或存在資料庫中;這個調度任務可以控制下最大同時並發的導出任務數,以避免任務太多拖垮系統。
另外需要開發界面查詢導出進度以及下載導出結果。導出結果可以考慮一個最大保存周期,比如7天。
java怎麼在數據超過百萬後分頁導出
用過POI的人都知道,在POI以前的版本中並不支持大數據量的處理,如果數據量過多還會常報OOM錯誤,
這時候調整JVM的配置參數
也不是一個好對策(註:
jdk在32位系統中支持的內存不能超過2個G,而在64位中沒有限制,但是在64位的系統中,性能並不是太好
),好在POI3.8版本新出來了一個SXSSFWorkbook對象,它就是用來解決大數據量以及超大數據量的導入導出操作的,但是SXSSFWorkbook只支持.xlsx格式,不支持.xls格式的Excel文件。
這裡普及一下,在POI中使用HSSF對象時,excel 2003最多只允許存6553數據,一般用來處理較少的數據量,這時對於百萬級別數據,Excel肯定
容納不了,而且在計算機性能稍低的機器上測試,就很容易導致堆溢出。當我升級到XSSF對象時,它可以直接支持excel2007以上版本,因為它採用
ooxml格式。這時excel可以支持1048576條數據,單個sheet表就支持近104
萬條數據了,雖然這時導出100萬數據能滿足要求,但使用XSSF測試後發現偶爾還是會發生堆溢出,所以也不適合百萬數據的導出。現在我們知道excel2007及以上版本可以輕鬆實現存儲百萬級別的數據,但是系統中的大量數據是如何能夠快速準確的導入到excel中這好像是個難題,對於一般的web系統,我們為了解決成本,基本都是使用的入門級web伺服器tomcat,既然我們不推薦調整JVM的大小,那我們就要針對我們的代碼來解決我們要解決的問題。在POI3.8之後新增加了一個類,
SXSSFWorkbook
,採用當數據加工時不是類似前面版本的對象,它可以控制excel數據佔用的內存,他通過控制在內存中的行數來實現資源管理,即當創建對象超過了設定的行數,它會自動刷新內存,將數據寫入文件,
這樣導致列印時,佔用的CPU,和內存很少。但有人會說了,我用過這個類啊,他好像並不能完全解決,當數據量超過一定量後還是會內存溢出的,而且時間還很長。對你只是用了這個類,但是你並沒有針對你的需求進行相應的設計,僅僅是用了,所以接下來我要說的問題就是,如何通過SXSSFWorkbook以及相應的寫入設計來實現百萬級別的數據快速寫入。
我先舉個例子,以前我們[資料庫
中存在大量的數據,我們要查詢,怎麼辦?我們在沒有經過設計的時候是這樣來處理的,先寫一個集合,然後執行jdbc,將返回的結果賦值給list,然後再返回到頁面上,但是當數據量大的時候,就會出現數據無法返回,內存溢出的情況,於是我們在有限的時間和空間下,通過分頁將數據一頁一頁的顯示出來,這樣可以避免了[大數據
量數據對內存的佔用,也提高了用戶的體驗,在我們要導出的百萬數據也是一個道理,內存突發性佔用,我們可以限制導出數據所佔用的內存,
這裡我先建立一個list容器,list中開闢10000行的存儲空間,每次存儲10000行,用完了將內容清空,然後重複利用
,這樣就可以有效控制內存,所以我們的設計思路就基本形成了,所以分頁數據導出共有以下3個步驟:
1、求資料庫中待導出數據的行數
2、根據行數求數據提取次數
3、按次數將數據寫入文件
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/254135.html