百万数据非同小可,这样做溢出是在所难免的 建议分批write

解决方案 »

  1.   

    做个类似批量处理的处理
    while (rs.next()) { 
              sb.append("|"); 
              sb.append(rs.getString(1)).append("|"); 
              sb.append(rs.getString(2)).append("|"); 
              sb.append(rs.getString(3)).append("|"); 
              sb.append(rs.getString(4)).append("|"); 
              sb.append(rs.getString(5)).append("|"); 
              sb.append(rs.getString(6)).append("|"); 
              sb.append(rs.getString(7)).append("|"); 
              sb.append(rs.getString(8)).append("|"); 
              sb.append(rs.getString(9)).append("|"); 
              sb.append(rs.getString(9)).append("|"); 
              sb.append(rs.getString(10)).append("|"); 
              sb.append(rs.getString(11)).append("|"); 
              sb.append("\n"); 
              count ++;
              if (count % 10000 == 0) {
               out.write(sb.toString()); 
               sb.delete(0, sb.length());
              }
            } 
      

  2.   

     if (count % 10000 == 0) {
                      out.write(sb.toString()); 
                      sb.delete(0, sb.length());
                  }
    这个方法可以,不过零头取不出来了。我做了个if判断,但是还是没有取出来,可能是我的写法不对。请知道指教一二
     if (count % 10000 == 0) {
                      out.write(sb.toString()); 
                      sb.delete(0, sb.length());
                      out.cloase(); 
                 } else if(count<10000){
                      out.write(sb.toString()); 
                      sb.delete(0, sb.length());
                      out.cloase();
    }
      

  3.   

    你可以在循环完了在执行一次out.write(sb.toString()); 
    零头不就出来了么
      

  4.   

            while (rs.next()) { 
                  sb.append("|"); 
                  sb.append(rs.getString(1)).append("|"); 
                  sb.append(rs.getString(2)).append("|"); 
                  sb.append(rs.getString(3)).append("|"); 
                  sb.append(rs.getString(4)).append("|"); 
                  sb.append(rs.getString(5)).append("|"); 
                  sb.append(rs.getString(6)).append("|"); 
                  sb.append(rs.getString(7)).append("|"); 
                  sb.append(rs.getString(8)).append("|"); 
                  sb.append(rs.getString(9)).append("|"); 
                  sb.append(rs.getString(9)).append("|"); 
                  sb.append(rs.getString(10)).append("|"); 
                  sb.append(rs.getString(11)).append("|"); 
                  sb.append("\n"); 
                  count ++;
                  if (count % 10000 == 0) {
                      out.write(sb.toString()); 
                      sb.delete(0, sb.length());
                  }
                } 
      

  5.   

    完整程序
    /**
       * @author dingting
       * @title  会计凭证信息文件
       * @param out BufferedWriter
       * @param sdate String
       * @return int 0为执行不成功,1为执行成功
       */
      public int oneWriteData(BufferedWriter out, String sdate) {
        odbcConnection mySybase = new odbcConnection();
        Connection conndb = null;
        PreparedStatement ps=null;
        ResultSet rs=null;
        int back = 0; //如果返回0为不成功,如果返回1为成功。
        try {
          conndb = mySybase.getConnection();
          conndb.setAutoCommit(false);//没执行前关闭所有链接
          String readStr = "select RFDT,IOMK,CYNO,BRNO,AMCD,OTCD,ACIT,TSAM,PRID,USID,MARK from XKJ where RFDT='" +sdate + "' order by BRNO";      System.out.println("dingting:Now end to excute from bankcredit..........");
          ps = conndb.prepareStatement(readStr);
          rs = ps.executeQuery();
          StringBuffer sb = new StringBuffer(128);
          int count = 0;
          while (rs.next()) {
            sb.append("|");
            sb.append(rs.getString(1)).append("|");
            sb.append(rs.getString(2)).append("|");
            sb.append(rs.getString(3)).append("|");
            sb.append(rs.getString(4)).append("|");
            sb.append(rs.getString(5)).append("|");
            sb.append(rs.getString(6)).append("|");
            sb.append(rs.getString(7)).append("|");
            sb.append(rs.getString(8)).append("|");
            sb.append(rs.getString(9)).append("|");
            sb.append(rs.getString(9)).append("|");
            sb.append(rs.getString(10)).append("|");
            sb.append(rs.getString(11)).append("|");
            sb.append("\n");
            count++;
            if (count % 10000 == 0) { //每次批量插入10000条
              out.write(sb.toString()); //插入文本
              sb.delete(0, sb.length()); //每次先清空一次缓存
              out.flush(); //要强迫写出一个输出流中的所有数据
            }
          }
           if (!sb.equals("")) {
             back = 1;
           }
          System.out.println("dingting:Now end to excute from bankcredit..........");
          out.write(sb.toString());
          out.flush();//要强迫写出一个输出流中的所有数据
          out.close();//要关闭一个输出流并释放所有与之相关的系统资源
        }
        catch (Exception ex) {
          System.out.println(mySybase.getErrorMessage(ex,"Application error,please contact to your Software Designer!").toString());
        }
        finally {
          try {
            if (rs != null) {
              rs.close();
            }
            if (ps != null) {
              ps.close();
            }
            if (conndb != null) {
              conndb.close();
            }
          }
          catch (Exception e) {
          }
        }
        return back;
      }---------
    @echo off
    echo 正在设置环境变量,请稍等......
    set JAVA_HOME=\jdk
    set path=%JAVA_HOME%\bin;%JAVA_HOME%\lib;
    set CLASS_PATH=%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
    echo 设置环境变量成功!!!
    echo dingting..............!!!
    java -Xms128m  -Xmx256m //-----主要在这里,对jvm进行配置
    cd /BankMessage/classes/
    java -cp ".;%CLASSPATH%" tf.dt.credit.view.CreditMessageView
    echo. & pause