项目S2SH架构,从库表中查出的记录有一万多条, JVM的值也调到足够大了,还是有这样的问题!有其他的好方法么?

解决方案 »

  1.   

    分段输出到excel。
    如:每次查询100记录写到excel里,刷新输出流。
      

  2.   

    一万多条记录,程序不挂掉才怪!调了内存能有什么用呢?反而增加服务器的压力。
    没必要导出那么多吧,一万多条记录导出后给别人看的效果是什么样?可想而知...
    查询的数据放在list中,你在当中放了1W多条,哦,不可想像!你很历害!
    建议换方法,不要导出那么多......
      

  3.   

    我认为这个异常有两方面的原因
    首先,你将1W多条数据装入List中,本身就是一个很吃内存的操作
    其次,又将1W条数据写入Excel更是雪上加霜
      

  4.   

    程序运行时,启动脚本 java后面加JVM参数。
    -Xmx512M 或者更大。就ok了
      

  5.   

    package com.daoyuan.common.tool;
    import java.io.*;import jxl.*;
    import jxl.write.WritableCell;
    import jxl.write.WritableSheet;
    import jxl.write.WritableWorkbook;
    import jxl.write.WriteException;
    import jxl.write.biff.RowsExceededException;import java.util.*;
    /** 
     * 2011-4-27 
     * Caozuo.java 
     * author:zhouquan
     * tel:15058149753
     * email:[email protected]
     */
    public class Caozuo {
    InputStream is = null; //定义一个输入流
    jxl.Workbook rwb = null;//定义一个只读的工作薄
    WritableWorkbook wr=null; //定义一个可写的工作薄
    FileOutputStream out=null;
    WritableSheet sheet=null;
    String worksheet = "List";//输出的excel文件工作表名      
     public Caozuo() {
    try {
    out=new FileOutputStream("E:\\a.xls");       
    wr=Workbook.createWorkbook(out);            
    sheet = wr.createSheet(worksheet, 0);
    // WritableWorkbook wr = Workbook.createWorkbook(new File("E:\\a.xls"));
    // //out=new FileOutputStream("E:\\a.xls");
    // is = new FileInputStream("E:\\a.xls");//创建一个输入流
    // rwb = Workbook.getWorkbook(is);//创建只读工作薄
    // //wr=Workbook.createWorkbook(out);
    // wr=Workbook.createWorkbook(new File("E:\\a.xls"), rwb);//创建可写的工作薄 } catch (Exception e) {
    e.printStackTrace();
    }
    } public ArrayList Select() {
    ArrayList arr = new ArrayList();
    Sheet rs = rwb.getSheet(0);//读取第一个表
    for (int i = 0; i < rs.getRows(); i++) {
    ArrayList arr1 = new ArrayList();
    for (int k = 0; k < rs.getColumns(); k++) {
    Cell c00 = rs.getCell(k, i);//k表示列,i表示行,注列和行从0开始
     
    String strc00 = c00.getContents();//getContents()方法是将Cell转换为字符串形式
    arr1.add(strc00);
    }
    arr.add(arr1);
    }
    rwb.close();
    return arr;
    } public void Insert() throws RowsExceededException, WriteException, IOException { 
    WritableSheet rs = wr.getSheet(0);//查找表一
    //WritableSheet rs = (WritableSheet)rwb.getSheet(0);

    int rownumber = rs.getRows();//多少行
    int cellnumber = rs.getColumns();//多少列
    for (int k = 0; k < cellnumber; k++) {
    jxl.write.Label labelC = new jxl.write.Label(k,rownumber,"这是第'"+rownumber+"'行,第'"+k+"'列");
    labelC.setString("fdsadf");
    //k表示哪一列,rownumber表示哪一行,从而定向到某个单元格,第三个参数是单元格内的内容
    rs.addCell(labelC);//把此单元格放入表中
    }

    wr.write();//写入
    wr.close();
    }
    public String  GoujianTable(String s ) throws Exception{
    int rownumber=s.split(";").length;
    int cellnumber=s.split(";")[0].split(",").length;
    String [] slist=s.split(";");
    String talbeString="<table >";
    for(int i=0; i<rownumber;i++){
    String [] sllist=slist[i].split(",");
    talbeString=talbeString+"<tr>";
    for(int k=0;k<cellnumber-1;k++){
    talbeString=talbeString+"<td>";
    talbeString=talbeString+sllist[k];
    talbeString=talbeString+"</td>";

    }
    talbeString=talbeString+"</tr>";
    }
    talbeString=talbeString+"</table>";
    return talbeString;
    }
    public void Inserted(String s ) throws Exception{
    int rownumber=s.split(";").length;
    int cellnumber=s.split(";")[0].split(",").length;
    WritableSheet rs = wr.getSheet(0);//查找表一
    String [] slist=s.split(";");
    for(int i=0; i<rownumber;i++){
    String [] sllist=slist[i].split(",");
    for(int k=0;k<cellnumber;k++){
    jxl.write.Label labelC = new jxl.write.Label(k,i,sllist[k]);
    rs.addCell(labelC);
    System.out.println("22");
    }

    }
    wr.write();//写入
    System.out.println("**********************");
    wr.close();
    }
    public void Delete(int id) throws IOException, WriteException{//id表示行号
    WritableSheet rs=wr.getSheet(0);//查找表一
    rs.removeRow(id-1);//删除行
    wr.write();//从内存中写入
    wr.close();

    }
    public void Update(int rowid,int columid,String cansu) throws RowsExceededException, WriteException, IOException{
    WritableSheet rs=wr.getSheet(0);
    //因为行和列都是从0开始,所以要减一
    jxl.write.Label labelC = new jxl.write.Label(columid-1,rowid-1,cansu);
    //WritableCell cell=(WritableCell) rs.getCell(columid-1,rowid-1);
    rs.addCell(labelC);
    wr.write();//写入
    wr.close();
    }
    }
      

  6.   

    我的csdn博客上有解决方法,我的处理方式有2种
    1.用windows的olddb驱动往excel里插入数据,必须生成文件在磁盘,并且必须在windows服务器系统
    2.用excel的xml形式,查询到数据直接追加到文件,别放到list里,直接用resultset.next查询到就写入文件,避免占用过大内存。
      

  7.   

    每个sheet最大行数为65535,多了要新开一个sheet,最多255个sheet
      

  8.   

    JDBC。50多W的數據也能出來
    不過文件。。100M,我靠
      

  9.   

    用JXL生成一個已經有第一列和多個分頁的EXCEL
    然後直接通過ODBC橋接,用JDBC寫操作,當寫了6W多行,就寫下一頁(其實是換了句SQL),不過要注意關閉CONNECTION,我是2W條關一次,不然會出奇怪的錯誤
      

  10.   

    POI占用资源比JXL大,如果只是简单汇出的话建议用jxl
      

  11.   


    能给我说说怎么把 查询出来的多个list 写入同一个文件吗?
    我也是分批查询,但是每次写入一个list 就不写了!很郁闷
    我的qq 435075657
      

  12.   

    分页查询,然后生成的excel保存在文件系统里而不放在内存里,每次查询后插入到文件系统的excel表里,删除内存中的结果集和excel,这样就不用很大内存了。
    不过我不知道poi操纵excel时,会不会把整个excel文件放入内存中去,你也可以到官网看看有什么优化方法。
      

  13.   

    用jdbc写啥意思? 不是还要打开excel文件吗?楼主可以试试jxl,或者直接用cvs格式