今天写了个程序往数据库插入100万条记录,代码如下
public static void insertRecords() throws Exception {
Connection conn = null;
try {
conn = DBUtil.getConnection();
conn.setAutoCommit(false);
while (count < TOTALNUM) {
PreparedStatement ps = conn.prepareStatement("select * from custfund limit ?");
ps.setInt(1, COPYNUM);
ResultSet rs2 = ps.executeQuery();
while (rs2.next() && count < TOTALNUM) {
PreparedStatement ps2 = conn
.prepareStatement("sql here...");
ps2.setInt(1, ++maxCustId);
ps2.setFloat(2, rs2.getFloat(2));
ps2.setFloat(3, rs2.getFloat(3));
ps2.setFloat(4, rs2.getFloat(4));
ps2.setFloat(5, rs2.getFloat(5));
ps2.setFloat(6, rs2.getFloat(6));
ps2.setFloat(7, rs2.getFloat(7));
ps2.setInt(8, rs2.getInt(8));
ps2.executeUpdate();
ps2.close();
count++;
if (count % 2000 == 0) {
System.out.println(count);
long curtime = new Date().getTime();
long timeUsed = curtime - time;
int remaincount = TOTALNUM - count;
System.out.println("remaining time:" + (remaincount / 2000) * timeUsed / 1000 + "s");
time = curtime;
conn.commit();
}
}
rs2.close();********
ps.close();********
}
System.out.println("total time:" + (new Date().getTime() - starttime) / 1000 + "S");
} finally {
if (conn != null) {
conn.close();
}
}
}
在****处如果不对rs, ps close,就会有java虚拟机out of memory.
按理说java虚拟机会自动垃圾回收,但为什么这里会这样呢?
原因是rs, ps没有关闭,java虚拟机认为它还在被使用。很多循环以后,就内存满了。