在eclipse中运行,连接的是mysql数据库。从别的表读出来,插到另一个表中。有25万条的数据,当插到9万条的时候,出现如下异常: 
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.nio.charset.CharsetEncoder.isLegalReplacement(Unknown Source)
at java.nio.charset.CharsetEncoder.replaceWith(Unknown Source)
at java.nio.charset.CharsetEncoder.<init>(Unknown Source)
at java.nio.charset.CharsetEncoder.<init>(Unknown Source)
at sun.nio.cs.ext.DoubleByteEncoder.<init>(Unknown Source)
at sun.nio.cs.ext.EUC_CN$Encoder.<init>(Unknown Source)
at sun.nio.cs.ext.EUC_CN.newEncoder(Unknown Source)
at java.lang.StringCoding$StringEncoder.<init>(Unknown Source)
at java.lang.StringCoding$StringEncoder.<init>(Unknown Source)
at java.lang.StringCoding.encode(Unknown Source)
at java.lang.String.getBytes(Unknown Source)
at com.mysql.jdbc.StringUtils.s2b(StringUtils.java:1423)
at com.mysql.jdbc.DatabaseMetaData.s2b(DatabaseMetaData.java:6290)
at com.mysql.jdbc.DatabaseMetaData.access$000(DatabaseMetaData.java:65)
at com.mysql.jdbc.DatabaseMetaData$7.forEach(DatabaseMetaData.java:3480)
at com.mysql.jdbc.DatabaseMetaData$IterateBlock.doForAll(DatabaseMetaData.java:76)
at com.mysql.jdbc.DatabaseMetaData.getPrimaryKeys(DatabaseMetaData.java:3452)
at com.mysql.jdbc.UpdatableResultSet.checkUpdatability(UpdatableResultSet.java:342)
at com.mysql.jdbc.UpdatableResultSet.<init>(UpdatableResultSet.java:134)
at com.mysql.jdbc.MysqlIO.buildResultSetWithRows(MysqlIO.java:2001)
at com.mysql.jdbc.MysqlIO.getResultSet(MysqlIO.java:447)
at com.mysql.jdbc.MysqlIO.readResultsForQueryOrUpdate(MysqlIO.java:1970)
at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:1387)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1727)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3118)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3047)
at com.mysql.jdbc.Statement.executeQuery(Statement.java:1166)
at baseindex.baseindex.move(baseindex.java:131)
at baseindex.baseindex.main(baseindex.java:198)

怎么办啊?

解决方案 »

  1.   

    把你的堆搞大点:-Xss512k -Xmx1024M
      

  2.   

    private static void move(DataBase chembook, DataBase baseindex)
    {
    //chem中的属性
    String nameOfChem; 
    String EN_nameOfChem; 
    String CAS_RNOfChem;
    //base中的相关属性
    String Name;
    String OtherNames;
    String CN_name;
    int ID=0;
    try{
    chembook.getConnection();
    chembook.rs=chembook.smt.executeQuery("select name, EN_name ,Id ,CAS_RN from "+chembook.tablename );
    baseindex.getConnection();
    String filename="E:\\jingwork\\outnew101.txt";
    BufferedWriter writer=new BufferedWriter (new  FileWriter(filename,true));
    while(chembook.rs.next())
    {
    //获得chem中的name, EN_name ,Id ,CAS_RN 并且去除其中的多余空格
    nameOfChem=chembook.rs.getString("name");
    EN_nameOfChem=chembook.rs.getString("EN_name");
    CAS_RNOfChem=chembook.rs.getString("CAS_RN");

    baseindex.rs=baseindex.smt.executeQuery("select Name, OtherNames ,CN_name,ID  from "+baseindex.tablename+" where CAS_RN = '"
    + CAS_RNOfChem + "'");

    while(baseindex.rs.next())
    {
    //获得对应baseindex中的相同CAS的Name, OtherNames和ID
    Name=baseindex.rs.getString("Name");
    OtherNames=baseindex.rs.getString("OtherNames");
    CN_name=baseindex.rs.getString("CN_name");
    ID=chembook.rs.getInt("ID");

    // System.out.println(Name);
    String UPDATE1="";
    String UPDATE2="";
    UPDATE1=makesql( baseindex,EN_nameOfChem,Name,"Name",OtherNames,"OtherNames",ID);
    UPDATE2=makesql( baseindex,nameOfChem,CN_name,"CN_name",OtherNames,"OtherNames",ID);
    try 
    {
    if(UPDATE1!=null)
    {
    writer.write(UPDATE1);
    writer.newLine();
        System.out.println(UPDATE1);
    }
    if(UPDATE2!=null)
    {
    writer.write(UPDATE2);
    writer.newLine();
    System.out.println(UPDATE2);
    }
    }
    catch (IOException ioe)
    {
    ioe.printStackTrace();
    }
    Statement smttemp1=(Statement) baseindex.con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
    if(UPDATE1!=null)
    smttemp1.executeUpdate(UPDATE1);
    Statement smttemp2=(Statement) baseindex.con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
    if(UPDATE2!=null)
    smttemp2.executeUpdate(UPDATE2);
    }
    }
    writer.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    chembook.closeConnection();
    baseindex.closeConnection();
    }
    主函数就是调用了这个函数  ,程序大致是这样chenbook和baseindex 是两个是数据库,分为为12万和25万多,出现异常的是baseindex,怎么才算是分批处理啊  我不会  帮帮忙
      

  3.   

    如果是在Tomcat里出现这种异常,可以通过修改Tomcat的内存大小来解决:
    /tomcat/bin/catalina.bat 加上下面的命令:
    set JAVA_OPTS=-Xms512k -Xmx1024m