问题是这样的,我用循环语句存储大量数据到Sql Server中时,前面几千行都没问题,然后突然就出现了“Error establishing socket”这个错误,我用synchronized规定同一时间只能运行一次存储方法了,还是出现这个错误,请高人给我指点一下!

解决方案 »

  1.   

    建议使用插入批处理Statement.addBatch(String sql)
    把最终处理好的SQL语句先加到batch中然后一次执行,效率貌似高一点
      

  2.   

    BlueSunny谢谢你的回答,我以前没用过addBatch,能否给个实例看看
      

  3.   

    BlueSunny谢谢你提供的方法,对程序运行有一定效果,可以多存储几百行数据进入数据库,但是到后来还是出现“Error establishing socket”错误了。
      

  4.   

    以下是我的代码,是利用POI读取excel表格,然后入库的一段程序,是不是 Action action = new Action();
     Property property = new Property();
     public synchronized void inputInfo(String type) {
            try {
                POIFSFileSystem fs = null;
                ResultSet rs = action.getSchoolAll(); //提取所有学校的名称
                String sheetname = "";
                if (type.equals("s1")) {
                    sheetname = "学员成绩表(4.0第一学期)";
                } else if (type.equals("s2")) {
                    sheetname = "学员成绩表(4.0第二学期)";
                } else if (type.equals("y2")) {
                    sheetname = "学员成绩表(4.0第二学年)";
                } else if (type.equals("osta")) {
                    sheetname = "osta";
                }
                while (rs.next()) {
                  String name = rs.getString("name"); //学校名称
                    String name_date = property.getAccp_Name_Date(); //excel名称中时间部分
                    String name_standard = property.getAccp_Name_Sdandard(); //excel名称中固定格式部分
                    String filename = name + name_date + name_standard + ".xls"; //合成excel文件名称
                    String filepath = property.getFilePath(); //excel文件路径                try {
                        fs = new POIFSFileSystem(new FileInputStream(filepath +
                                filename));
                        HSSFWorkbook workbook = new HSSFWorkbook(fs);
                        HSSFSheet sheet = workbook.getSheet(sheetname);
                        int i = 5;
                        System.out.println(
                                "------------------------------------------------------------\n" +
                                filename);
                        int x = 1;
                        while (true) {
                            HSSFRow row = sheet.getRow(i); //行,从0开始
                            HSSFCell cell = row.getCell((short) 1); //列,从0开始
                            String value = cell.toString();
                            if (value.equals("") || value == null) {
                                break;
                            }
                            if (value.indexOf(".") > 0) {
                                value = value.substring(0, value.indexOf(".")) +
                                        value.
                                        substring(value.indexOf(".") + 1,
                                                  value.indexOf("E"));
                            }
                            if (value.length() < 8) {
                                value = value + "0";
                            }
                            System.out.print(x++);
                            System.out.print(" 准考证:" + value + " | ");
                            String examid = value;                        row = sheet.getRow(i); //行,从0开始
                            cell = row.getCell((short) 2); //列,从0开始
                            value = cell.toString();
                            System.out.print("姓名:" + value + " | ");
                            String username = value;                        row = sheet.getRow(i); //行,从0开始
                            cell = row.getCell((short) 3); //列,从0开始
                            value = cell.toString();
                            System.out.print("拼音:" + value + " | ");
                            String namespell = value;                        row = sheet.getRow(i); //行,从0开始
                            cell = row.getCell((short) 5); //列,从0开始
                            value = cell.toString();
                            System.out.print("身份证号:" + value + " | ");
                            String idcard = value;                        row = sheet.getRow(i); //行,从0开始
                            cell = row.getCell((short) 19); //列,从0开始
                            value = cell.toString();
                            System.out.print("结业操作:" + value + " | ");
                            String skillgrade = value;                        row = sheet.getRow(i); //行,从0开始
                            cell = row.getCell((short) 20); //列,从0开始
                            value = cell.toString();
                            System.out.print("结业理论:" + value + " | ");
                            String theorygrade = value;                        row = sheet.getRow(i); //行,从0开始
                            cell = row.getCell((short) 22); //列,从0开始
                            value = cell.toString();
                            System.out.println("备注:" + value);
                            String re = value;                        action.setInfo(examid, username, namespell, idcard,
                                           skillgrade, theorygrade, re);                        i = i + 1;
                        }
                        System.out.println(
                                "---------------------------------------------------------------");
                    } catch (NullPointerException npe) {
                        npe.printStackTrace();
                        System.out.println("错误信息: 没有找到这张表!");
                        System.out.println(
                                "以上路径发生错误!\n------------------------------------------------");
                    }
                }
                rs.close();
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println(
                        "以上路径发生错误!\n------------------------------------------------");
            }
        }
      

  5.   

    我写了一个小程序 
    我这里没多的数据
    一下读去了几百W(也可能上千W了,我自己都不清楚了)
    写入数据库3W多条(从上面数据中统计出来的数据)
    要不要SEE SEE
      

  6.   

    说实话你这段代码的逻辑比较混乱,强烈建议你重构一下,理清思路
    你的流程应该是
    1.查库获取所有学校名称
    2.读取Excel文件
    3.构造入库的SQL语句
    4.使用addbatch然后去执行
    我猜测你入库的代码是写在action.setinfo()里面的吧,这样实际上你每次遍历rs的时候都往数据库里插入了一条记录吧,我认为遍历rs实际上应该构造一个能够批执行的语句或者其他什么东西,然后需要让action这个对象支持批量操作。
      

  7.   

    看看我的怎么样
    package com.print;
    import java.io.File;
    import java.io.FilenameFilter;
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.sql.Timestamp;
    import java.util.Date;
    import java.util.Iterator;
    import java.util.Vector;import org.apache.commons.dbcp.BasicDataSource;/*
     * 创建日期 2007-11-23
     *
     * 更改所生成文件模板为
     * 窗口 > 首选项 > Java > 代码生成 > 代码和注释
     *//**
     * @author lianglei.zhu
     *
     * 更改所生成类型注释的模板为
     * 窗口 > 首选项 > Java > 代码生成 > 代码和注释
     */
    public class test {
    public static void main(String[] arg0) {
    //存储单日志的统计信息
    Vector result = new Vector();
    //存储所有日志的统计信息
    Vector resultCount = new Vector(); java.sql.Date date = null; File dir = new File("E:\\function\\"); date = new java.sql.Date(dir.lastModified()); File[] fnLogFile = dir.listFiles(new FilenameFilter() {
    public boolean accept(File arg0, String arg1) {
    // TODO 自动生成方法存根
    return arg1.startsWith("function.log");
    } }); File fn = null; BasicDataSource bs = new BasicDataSource();
    bs.setDriverClassName("com.ibm.as400.access.AS400JDBCDriver");
    bs.setUrl("jdbc:as400://192.168.1.220;databasename=ERPDEVDB");
    bs.setUsername("ERPDEVDB");
    bs.setPassword("ERPDEVDB");
    bs.setMaxActive(5); Connection conn = null;
    PreparedStatement psmt = null;
    /*
     * 方法一
     * 适合日志的批量处理
     * */ for (int i = 0; i < fnLogFile.length; i++) {
    fn = fnLogFile[i]; System.out.println(fn.getName());
    java.sql.Date oldTime = new java.sql.Date(fn.lastModified());
    System.out.println(oldTime);
    //如果日志出现重复
    if (oldTime.getDate() == date.getDate()
    && oldTime.getMonth() == date.getMonth()) {
    result = (Vector) resultCount.get(resultCount.size() - 1);
    resultCount.remove(resultCount.size() - 1);
    result = new InputFile(fn).doublelog(result);
    } else {
    date = oldTime;
    //获得日志统计信息
    result = new InputFile(fn).getVeResult();
    }
    resultCount.add(result);
    }
    try {
    //连接ODBC
    conn = bs.getConnection(); conn.setAutoCommit(false);
    psmt =
    conn.prepareStatement("insert into BSC00050P values (?,?,?,?)");
    //循环读取日志的统计信息,并提交到PSMT中
    for (Iterator iter = resultCount.iterator(); iter.hasNext();) {
    result = (Vector) iter.next(); for (Iterator itr = result.iterator(); itr.hasNext();) { BSC bsc = (BSC) itr.next();
    psmt.setString(1, bsc.getFunctionId());
    psmt.setDate(2, bsc.getUsageDate());
    psmt.setInt(3, bsc.getCount());
    psmt.setTimestamp(4, bsc.getLastTime());
    psmt.addBatch();
    }
    }
    //PSMT批量处理
    psmt.executeBatch();
    System.out.println("Success!!!");
    } catch (SQLException e) {
    // TODO 自动生成 catch 块
    e.printStackTrace();
    try {
    if (conn != null)
    System.out.println("conn error");
    conn.rollback();
    } catch (SQLException e1) {
    // TODO 自动生成 catch 块
    e1.printStackTrace();
    }
    } finally { try {
    if (psmt != null)
    psmt.close();
    if (conn != null) {
    conn.setAutoCommit(true);
    conn.close();
    }
    } catch (Exception e) {
    // TODO: handle exception
    }
    if (resultCount != null)
    resultCount = null;
    }
    /*
     * 方法二
     * 适合单日志处理
     * */
    /*for (int i = 0; i < fnLogFile.length; i++) {
    fn = fnLogFile[i];
    System.out.println(fn.getName());

    java.sql.Date oldTime=new java.sql.Date(fn.lastModified());

    // System.out.println(new java.sql.Date(fn.lastModified()));
    // result = new InputFile(fn).getVeResult();

    try {
    conn = bs.getConnection();
    conn.setAutoCommit(false);
    psmt =
    conn.prepareStatement(
    " insert into BSC00050P values (?,?,?,?) ");
    // for (Iterator iter = result.iterator(); iter.hasNext();) {
    // BSC bsc = (BSC) iter.next();
    // psmt.setString(1, bsc.getFunctionId());
    // psmt.setDate(2, bsc.getUsageDate());
    // psmt.setInt(3, bsc.getCount());
    // psmt.setTimestamp(4, bsc.getLastTime());
    // psmt.addBatch();
    // }
    // psmt.executeBatch();
    System.out.println("insert Success!!!");

    } catch (SQLException e) {
    // TODO 自动生成 catch 块

    e.printStackTrace();
    } finally {
    try {
    if (psmt != null)
    psmt.close();
    if (conn != null) {
    conn.setAutoCommit(true);
    conn.close();
    }
    } catch (Exception e) {
    // TODO: handle exception
    }
    }

    }*/ }
    }
      

  8.   

    victoryzll 谢谢你的帮助!我现在就来学习一下你的方法
      

  9.   

    呵呵,没问题,我也要下班了,到家后我试验一下你的方法,再次感谢victoryzll的热心回答,我一定给你分的!
      

  10.   

    思路大概就是这样的,lz需要做的是仿照你构造batch的方法,把他的数据结构套进去
      

  11.   

    这个就是换预处理啊 和直接sql的区别不大 只不过是执行的效率稍微高一点 也不是什么高深的东西啊 有什么好学的
      

  12.   

    我试验了一下你的方法感觉效果一般,我在每次存储数据库的之后都让程序sleep(20),这样就可以不出错的存储数据库了,是不是程序需要用线程控制一下呀?