日期:2014-05-17  浏览次数:20725 次

在一个connection内,短时间访问数据库几万次会导致connection自动关闭么?
最近写了个小程序,从日志文件当中抓取IP
-------------------------------------此为背景--------------------------------------------
问题描述:日志文件很多(每天的日志文件保存在一个日期命名的文件夹里,每个日志文件为10M,超过自动写入一个新的日志文件),算下来,每个日志文件有6W条数据。
          每读出一条记录,就判断记录中的IP在数据库是否存在,如果不存在则写入数据库,否则取下一条记录。
          我试过每次查询都新建一个connection,但循环到1000条的时候就报内存溢出的错了,数据库缓存爆掉了(貌似),所以我改用一个connection来完成所有的查询操作。
          结果现在一个日志文件都还没有分析完就报
com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: No operations allowed after connection closed.这个错误,网上找了很多都没找到一个可行的方案。
求大神赐教!
PS:我没有使用任何框架,就是最原始的java project,只添加了一个jar包:mysql-connector-java.jar。
下面是我的部分代码:
public void saveLogFiles() throws IOExceptionSQLExceptionClassNotFoundException {

Long count = 0L; // 重复记录条数
BufferedReader br = null;
String syslogPath = "D:\\syslog";
File syslog = new File(syslogPath);
Connection con = backUpDao.getConnection();
List<LogInfo> logInfos = new ArrayList<LogInfo>();

for (String dayFileName : syslog.list()) {

String daFilePath = syslogPath + "\\" + dayFileName;
File dayFile = new File(daFilePath);
if (dayFile.isFile()) {

// 如果在syslog文件夹下的当前文件不是日志文件夹,则判断下一个文件
continue;
}
for (String logFileName : dayFile.list()) {

String logFilePath = syslogPath + "\\" + dayFileName + "\\" + logFileName;
System.out.println("正在分析日志文件:" + logFilePath);
File logFile = new File(logFilePath);
try {

br = new BufferedReader(new FileReader(logFile));
String line = "";
while ((line = br.readLine()) != null) {

int indexOfLen = line.indexOf("len");
int indexOfFrom = line.indexOf("from");

if (indexOfLen == -1 || indexOfFrom == -1) {

// 如果找不到对应字符,则跳过该行
continue;
}

String srcIpAndPort = getSrcIpFromLog(line);
String srcIp = srcIpAndPort.split(":")[0];

String destIpAndPort = getDesIpFromLog(line);
String destIp = destIpAndPort.split(":")[0];

String date = getDateFromLog(line, indexOfLen, indexOfFrom);

Calendar cal = Calendar.getInstance();

long startDate = sdf.parse(date).getTime();

cal.setTimeInMillis(startDate);
cal.set(Calendar.DATE, cal.get(Calendar.DATE) +1);

long endDate = cal.getTi