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:......