用JAVA循环添加大量数据到Sql Server时出现“Error establishing socket” 问题是这样的,我用循环语句存储大量数据到Sql Server中时,前面几千行都没问题,然后突然就出现了“Error establishing socket”这个错误,我用synchronized规定同一时间只能运行一次存储方法了,还是出现这个错误,请高人给我指点一下! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 建议使用插入批处理Statement.addBatch(String sql)把最终处理好的SQL语句先加到batch中然后一次执行,效率貌似高一点 BlueSunny谢谢你的回答,我以前没用过addBatch,能否给个实例看看 BlueSunny谢谢你提供的方法,对程序运行有一定效果,可以多存储几百行数据进入数据库,但是到后来还是出现“Error establishing socket”错误了。 以下是我的代码,是利用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------------------------------------------------"); } } 我写了一个小程序 我这里没多的数据一下读去了几百W(也可能上千W了,我自己都不清楚了)写入数据库3W多条(从上面数据中统计出来的数据)要不要SEE SEE 说实话你这段代码的逻辑比较混乱,强烈建议你重构一下,理清思路你的流程应该是1.查库获取所有学校名称2.读取Excel文件3.构造入库的SQL语句4.使用addbatch然后去执行我猜测你入库的代码是写在action.setinfo()里面的吧,这样实际上你每次遍历rs的时候都往数据库里插入了一条记录吧,我认为遍历rs实际上应该构造一个能够批执行的语句或者其他什么东西,然后需要让action这个对象支持批量操作。 看看我的怎么样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 } } }*/ }} victoryzll 谢谢你的帮助!我现在就来学习一下你的方法 呵呵,没问题,我也要下班了,到家后我试验一下你的方法,再次感谢victoryzll的热心回答,我一定给你分的! 思路大概就是这样的,lz需要做的是仿照你构造batch的方法,把他的数据结构套进去 这个就是换预处理啊 和直接sql的区别不大 只不过是执行的效率稍微高一点 也不是什么高深的东西啊 有什么好学的 我试验了一下你的方法感觉效果一般,我在每次存储数据库的之后都让程序sleep(20),这样就可以不出错的存储数据库了,是不是程序需要用线程控制一下呀? 关于try catch finally,请详解 感谢大家的支持~~菜鸟的扫雷修改了一下,再发一次,期待大家的意见 Java实现各种排序! 正则表达式问题 请高手指教 JAVA是否有延时语句,如过有该如何使用 请问如何让 tree的树型结构图 的更好看一些呢? 关于JTable的简单问题 具体求教DOM、SAX、XSLT的意义,送20分!!! java日期字符串問題!!!!!!!!!!!!!! 关于java复制GIF格式图片到剪辑板的问题 请问ArrayList可以存储简单数据类型吗? 高分,求一段算法:字符串转换为循环
把最终处理好的SQL语句先加到batch中然后一次执行,效率貌似高一点
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------------------------------------------------");
}
}
我这里没多的数据
一下读去了几百W(也可能上千W了,我自己都不清楚了)
写入数据库3W多条(从上面数据中统计出来的数据)
要不要SEE SEE
你的流程应该是
1.查库获取所有学校名称
2.读取Excel文件
3.构造入库的SQL语句
4.使用addbatch然后去执行
我猜测你入库的代码是写在action.setinfo()里面的吧,这样实际上你每次遍历rs的时候都往数据库里插入了一条记录吧,我认为遍历rs实际上应该构造一个能够批执行的语句或者其他什么东西,然后需要让action这个对象支持批量操作。
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
}
}
}*/ }
}