大致步骤是读取一个包含十六万+行的文档数据,并将数据存放到数据库,但是在该方法执行完成后所占用的内存资源没有被释放,求大神指教~
(这程序是用swing开发的桌面程序,不知是不是跟用了swing有关)
以下代码是核心部分:
String sql = "insert into "+tableName+"("+imuField+") values(?,?,?,?,?,?,?,?,?)";
Connection c = JDBCUtil.getConnection(); // 获取数据库连接
try {
Statement statement=c.createStatement();
statement.executeUpdate(createTable); // 创建表
System.err.println(tableName+"表创建成功,准备写入数据...");
c.setAutoCommit(false); // 手动提交
PreparedStatement ps= c.prepareStatement(sql);
File imuFile= new File(file);
List<String> strList=FileIUtils.readLine(imuFile,"utf-8", index, offset); // 读取文件内容
if(strList==null || strList.size()<1) {
SwingUtils.warn(jf, null, "选择的文件不存在IMU数据");
}
Integer n=0;
Integer not=0;
Integer i= 0;
StringBuilder utcTime = new StringBuilder();
String[] strs = new String[1024];
long begin = System.currentTimeMillis(); // 记录开始时间
jProgressBar.setMaximum(strList.size()); // 加载进度条
for(String strLin: strList) {
n++;
i++;
jProgressBar.setValue(n); // 加载进度条
strs = strLin.split("\t");
if(strs[0]!=null && Utils.isContainNumber(strs[0])
&& strs[1]!=null && Utils.isContainNumber(strs[1])
&& strs[2]!=null && Utils.isContainNumber(strs[2])
&& strs[3]!=null && Utils.isContainNumber(strs[3])
&& strs[4]!=null && Utils.isContainNumber(strs[4])
&& strs[5]!=null && Utils.isContainNumber(strs[5])
&& strs[6]!=null && Utils.isContainNumber(strs[6])
&& strs[7]!=null && Utils.isContainNumber(strs[7])
&& strs[8]!=null && Utils.isContainNumber(strs[8])) {
Date GpsDate = Utils.StringToDate(strs[1]+" "+strs[0]); // GPS时间处理(0,1元素拼接起来为GPS时间)
ps.setDate(1,new java.sql.Date(GpsDate.getTime()));
ps.setLong(2, GpsDate.getTime());
ps.setString(3, strs[2]);
ps.setString(4, strs[3]);
ps.setString(5,strs[4]);
ps.setString(6, strs[5]);
ps.setString(7, strs[6]);
ps.setString(8, strs[7]);
utcTime.setLength(0);
utcTime.append(strs[1]).append(" "+strs[8]);
ps.setString(9, utcTime.toString());
ps.addBatch();
if(i>=100000) { // 累计到十万条时执行SQL
i=0;
ps.executeBatch();
c.commit();
}
}else {
not++;
continue;
}
}
if(ps!=null) {
ps.executeBatch();
ps.close();
c.commit();
}
System.out.println("插入完成,耗时约 "+(System.currentTimeMillis()-begin)/1000+" 秒");
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtil.closeConnection(c); // 回收连接
}
以下是程序启动时内存占用情况:
以下是程序执行SQL方法时内存的占用情况:
以下是该方法执行完成后内存占用情况(与运行中差不多,或更高):