在执行数据操作语句的时候,我不想每个方法里都写上很长的try{}cache(){},而且怕忘掉关闭数据库连接。
所以我就写了这样一个类。public static ResultSet excuteQuery(String sql){   Connection conn= //取得connection
   ResultSet rs=null;
   try{
    Statment stmt=conn.createStatment();
    rs=stmt.excuteQuery(sql);
    stmt.close(); //注意这一行
   }catch(Excepiton e){   }finally{
    conn.close();
   }
   return rs;
}//测试程序
pulbic void test(){
ResultSet rs=excuteQuery("select * from user ");
while(rs.next()){
  System.out.println(rs.getString(1));
}}
在调试的时候我发现一个很怪的问题。
如果我的excuteQuery中加入了 stmt.close(); test()里取得的RS就是空的
如果去掉stmt.close();  test()里就可以正确的打印出结果。
请问一下这是为什么? 如果我把不要stmt.close();  会不会导致服务器的内存溢出阿???

解决方案 »

  1.   

    stmt.close();在return rs之前执行,所以return null;
    应该这样,所有操作完毕再close; 
    finally{
    stmt.close(); 
    conn.close();
    }
      

  2.   

    如果你服务器内存足够的话,呵呵,可以不close,当然最好关闭
      

  3.   

    stmt是你对数据库的保持,rs只是他的结果级,保持断掉了,他指向的结果当然也没了,应该按一楼说的做,但不是加到excuteQuery(String sql)里,而是把stmt传入,方法改称excuteQuery(String sql, Statment stmt),执行完再close(),不过我觉得这种方法没什么用,刚开始肯定容易忘关,多错几次就记住了,没有必要做一个这种方法,rs也不是最终结果,还是需要getObject,所以很难公用
      

  4.   

    在调试的时候我发现一个很怪的问题。
    如果我的excuteQuery中加入了 stmt.close(); test()里取得的RS就是空的----------------------------------------------------------------------public void close()A Statement object is automatically closed when it is garbage collected. When a Statement object is closed, its current ResultSet object, if one exists, is also closed. (当一个Statement对象关闭时,由它产生的ResultSet也将关闭)当然文档也讲说了:
    It is generally good practice to release resources as soon as you are finished with them to avoid tying up database resources.
      

  5.   


    finally{
    stmt.close(); 
    conn.close();
    }
    这点很重要,