首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

dom4j一次写入2W条数据内存溢出

2012-01-24 
dom4j一次写入2W条数据内存溢出,在线等dom4j有一个writeElement的方法,在循环中写入文件的话,没有根节点和

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是把整个树都建立起来的.

热点排行