Connection conn = null;
PrepareStatement ps = null;
ResultSet rs = null;
String sql = "select * from ... where id =? ";
try{
conn = forName("jdbc.***");
for(**;**;**){
//notice : there is a "ps=conn.prepaeStatement" in loop
ps= conn.prepareStatement(sql);
ps.setString(1,"4");
rs=ps.executeQuery();
while(rs.next()){
......
}
}
}catch(Exception e){
}finally{
close(conn,ps,rs);
}
咳!咳!在循环中ps=conn.prepareStatement(),循环结束的末尾没有没有close ps,那么每次循环都会再次创建一个ps,对应在“在DB中”会打开了一个Cursor,而且循环中执行完ps.executeQuery()后没有ps.close()。
自己就用大腿思考了下,ps变量我就只有一个呀!即使每次循环执行ps=conn.preapareStatement(),我这不就是重新赋值吗!前任ps对象不就没有引用指向了吗!那么不就被GC灰收了吗!
too younge too simple sometimes navie ,每次创建ps的对象会在“DB”中打开了一个Cursor。是特么GC的锅吗!GG肯定把前任ps干掉了(哭,哭也没用),怎么干得掉DB中打开的Cursor呢!(尼玛,看来大长腿还是没大脑好用)
导演:各部门准备好,action!!!!
java向oracle/mysql喊话:你们这些比比,放那么多Cursor出来,还特么不个老子管管!
oracle:“怪我喽”!
mysql:“怪我喽”!
java:......
学习不忘抄>>http://my.oschina.net/zenglingfan/blog/62746