日期:2014-05-20  浏览次数:20806 次

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

------解决方案--------------------
建议使用插入批处理Statement.addBatch(String sql)
把最终处理好的SQL语句先加到batch中然后一次执行,效率貌似高一点
------解决方案--------------------
看看我的怎么样
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 块