2 wuhaoi007 wuhaoi007 于 2014.05.06 20:46 提问

Eclipse用JAVA连接Mysql 插入大量数据报错 Java heap space

public void Get_WayId_Ref_isWay() throws IOException
{

    PreparedStatement ps = null; 
    Connection con=null;
    BufferedReader br=new BufferedReader(new FileReader(Path.path_read_beijing));

    StringBuffer s=null;
    StringBuffer wayId=null;
    StringBuffer isWay=new StringBuffer("false");
    String regex_nd="\\d+";
    //用匹配<way id后面的数字
    String regex_id="(?<=id=\")\\d+";
    //读取整个文件信息
    try {

        Class.forName(driver).newInstance();
        con=DriverManager.getConnection(url,user,pwd);
        con.setAutoCommit(false);
        int count=0;
        int batchCount=1;
        while((s=new StringBuffer(br.readLine()))!=null)
        {
            count++;
            ArrayList<StringBuffer> tmp=new ArrayList<StringBuffer>();
            //找出way类的信息
            if(batchCount%100==0)
            {
                ps.clearBatch();
            }
            if(s.indexOf("<way")>0)
                {

                  //获得每一组WayId
                  Pattern p1=Pattern.compile(regex_id);
                  Matcher m1=p1.matcher(s);
                  if(m1.find())
                  {
                      wayId=new StringBuffer(m1.group());
                  }
                  while (s.indexOf("</way>") <= 0) 
                  {
                     count++;
                     s=new StringBuffer(br.readLine());
                     //获得该wayid下的refid
                     if(s.indexOf("<nd")>0)
                     {
                         System.out.println("所在行数:"+count);
                         Pattern p=Pattern.compile(regex_nd);
                         Matcher m=p.matcher(s);        
                        if(m.find())
                        {
                            tmp.add(new StringBuffer(m.group()));
                        }
                     }

                     //判断该way是否为道路
                    if(s.indexOf("<tag k=\"highway\"")>0||s.indexOf("<tag k=\"cycleway\"")>0||s.indexOf("<tag k=\"bridge\"")>0)
                    {
                        isWay=new StringBuffer("true");
                    }
                }

                 for(int i=0;i<tmp.size();i++)
                 {      

                        if(isWay.toString().equals("true"))
                        {
                            batchCount++;
                            StringBuffer sql1 = new StringBuffer();
                            sql1.append("insert into test_wayid(wayid,id,isway) values(");
                            sql1.append("'" +wayId+"'");
                            sql1.append(", '"+tmp.get(i)+"', '"+"1');");                        
                            ps=con.prepareStatement(sql1.toString());
                            ps.addBatch();

                        }
                        if(isWay.toString().equals("false"))
                        {
                            batchCount++;
                            StringBuffer sql1 = new StringBuffer();

                            sql1.append("insert into test_wayid(wayid,id,isway) values(");
                            sql1.append("'" +wayId+"'");
                            sql1.append(", '"+tmp.get(i)+"', '"+"1');");

ps=con.prepareStatement(sql1.toString());
ps.addBatch();

                        }
                        ps.executeBatch();
                        if(batchCount%100==0)
                        {
                            con.commit();
                        }

                    }



                }
        }
        con.commit();
    } catch (Exception e) {
        e.printStackTrace();
        // TODO: handle exception
    }finally{
        try {
            if(ps!=null) ps.close();
            if(con!=null) con.close();
        } catch (Exception e2) {
            e2.printStackTrace();
        }
    }


    }

报的错误是:
java.sql.SQLException: java.lang.OutOfMemoryError: Java heap space
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:430)
at com.mysql.jdbc.PreparedStatement.getInstance(PreparedStatement.java:561)
at com.mysql.jdbc.ConnectionImpl.clientPrepareStatement(ConnectionImpl.java:1395)
at com.mysql.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:4178)
at com.mysql.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:4077)
at Wayid_To_Sql.Get_Map_Line_beta.Get_WayId_Ref_isWay(Get_Map_Line_beta.java:128)
at Wayid_To_Sql.Get_Map_Line_beta.main(Get_Map_Line_beta.java:35)

2个回答

paperbook
paperbook   2014.05.12 09:32

堆空间不足,需要在jvm中把堆的大小设大一些-Xmx

u012941811
u012941811   2014.05.14 14:00

PreparedStatement 有一个clearBatch 方法,做完一批后 clear下试试

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!