dom4j一次写入2W条数据内存溢出,在线等
dom4j有一个write Element的方法,在循环中写入文件的话,没有根节点和文件头,想问问各位有没解决办法,以下是部分代码:
public class FriendsViewByTableName
{
private XMLWriter writer = null;
//调用dom4j中的一个类来解决中文问题,在得到writer时把format传进去
OutputFormat format = OutputFormat.createPrettyPrint();
public void viewData(Adm_chgtmp adm)
{
/** 指定XML编码 */
format.setEncoding( "GBK ");
String tableName = null;
String columnName = null;
String columnValue = null;
Element friendElement = null;
Element ageElement = null;
Document document = null;
String sql = " ";
String sql1 = " ";
ResultSet rs = null;
ResultSet rs1 = null;
dbcon connect = null;
StringTMPID = adm.getTMPID();
StringTMPDESC = adm.getTMPDESC();
StringALLROWS= adm.getALLROWS();
StringMARKISNEW = adm.getMARKISNEW();
StringDELETEON = adm.getDELETEON();
StringTMPDATA=adm.getTMPDATA();
StringISNEW = adm.getISNEW();
TimestampLASTUPDATE = adm.getLASTUPDATE();
List list = stringToken(TMPDATA);
Iterator it = list.iterator();
try
{
document = DocumentHelper.createDocument();
Element friendsElement = document.addElement( "DATA ");
//document.setRootElement(friendsElement);
// try {
//writer.processingInstruction( "xml version=\ "1.0\ " ", "encoding=\ "GBK\ " ");
//} catch (SAXException e1) {
//// TODO Auto-generated catch block
//e1.printStackTrace();
//}
while(it.hasNext())
{
tableName = (String)it.next();
sql = "select * from " + tableName + " where ISNEW = 1 ";
sql1 = "select * from syscolumns where id=object_id( ' "+ tableName + " ') " ;
try{
connect = new dbcon();
rs = connect.executeQuery(sql);
rs1 = connect.executeQuery(sql1);
rs1.last();
int row = rs1.getRow();
String column[] = new String[row];
rs1.beforeFirst();
System.out.println(row);
while(rs1.next())
{
for(int i=0;i <row;i++)
{
column[i] = rs1.getString( "name ");
rs1.next();
}
}
while(rs.next())
{
friendElement = friendsElement.addElement(tableName);
for(int i = 0;i <column.length;i++)
{
columnName = column[i];
columnValue = rs.getString(columnName);
System.out.println( "列名: "+columnName);
System.out.println( "值: "+columnValue);
ageElement = friendElement.addElement(columnName);
ageElement.setText((columnValue+ " ").toString().trim());
}
// writer.write(friendElement);
// friendElement.clearContent();//释放这个Element的空间,不然会导致内存耗尽
//friendsElement.clearContent();
}
//writer.write(friendsElement);
} catch( SQLException e){
e.printStackTrace();
} catch( Exception e){
e.printStackTrace();
}
finally
{
try
{
if(rs!=null)
rs.close();
if(rs1!=null)
rs1.close();
connect.closeConnect();
}
catch(SQLException e)
{
e.printStackTrace();
}
}
writer = new XMLWriter(new FileWriter(new File( "C:/exp/friend.xml "),true),format);
writer.write(document);
System.out.println( "创建文件成功 ");
}
} catch (IOException e)
{
e.printStackTrace();
}
finally
{
if(writer != null)
{
try
{
writer.close();
}
catch(Exception err)
{
err.printStackTrace();
}
}
}
}
public List stringToken(String tableName)
{
List list = new ArrayList();
StringTokenizer stok = new StringTokenizer(tableName, ", ");
while(stok.hasMoreElements())
{
list.add(stok.nextToken());
}
return list;
}
}
[解决办法]
写过大的数据量的话不要用DOM,用SAX来写最好
[解决办法]
数据量有10M吗,网上的测试是10M的数据会溢出的,你试着调大java的stack size的大小试试,具体的方法如下
设置一下stack size的大小 java 后跟参数即可设置,具体参数如下:
-Xms size set initial Java heap size
-Xmx size set maximum Java heap size
-Xss size set java thread stack size
[解决办法]
换个其他的包比较好. dom4j是把整个树都建立起来的.