如果我在一个程序中同时用Connection,PrepareStatement,ResultSet,应该如何关闭这些资源 ?我只关闭Connection而不关闭其他两个会怎样?
我只关闭Connection,PrepareStatement而不关闭ResultSet会怎样?

解决方案 »

  1.   

    依次关闭
    rs.close();
    ps.close();
    con.close();
      

  2.   

    如果不关闭其他两个的话,可能会由JAVA得垃圾回收机制来执行吧
      

  3.   

    Connection 的关闭方法   
     /**
         * Releases this <code>Connection</code> object's database and JDBC resources
         * immediately instead of waiting for them to be automatically released.
         * <P>
         * Calling the method <code>close</code> on a <code>Connection</code>
         * object that is already closed is a no-op.
         * <P>
         * It is <b>strongly recommended</b> that an application explicitly 
         * commits or rolls back an active transaction prior to calling the 
         * <code>close</code> method.  If the <code>close</code> method is called
         * and there is an active transaction, the results are implementation-defined.
         * <P>
         * 
         * @exception SQLException SQLException if a database access error occurs 
         */
    Statement的colse方法
        /**
         * Releases this <code>Statement</code> object's database 
         * and JDBC resources immediately instead of waiting for
         * this to happen when it is automatically closed.
         * It is generally good practice to release resources as soon as
         * you are finished with them to avoid tying up database
         * resources.
         * <P>
         * Calling the method <code>close</code> on a <code>Statement</code>
         * object that is already closed has no effect.
         * <P>
         * <B>Note:</B>When a <code>Statement</code> object is 
         * closed, its current <code>ResultSet</code> object, if one exists, is 
         * also closed.  
         *
         * @exception SQLException if a database access error occurs
         */
        void close() throws SQLException;
    这个应该可以得出关Statement就不用关ResultSet了,也就是说我只关Connection和Statement就可以了  ?
      

  4.   

    其实最关键的应该是connection的关闭,其他你关不关都没有事。connection是占用数据库资源。
      

  5.   

    我的意思是“只关闭Connection或只关闭Connection,PrepareStatement会怎样? ”
    关键是“会怎样”,我知道依次关闭这回事好吧,高手指点
      

  6.   

    Connection 一定要关闭的  其他两个不关闭没有试过会有什么问题   一般都关闭 
      

  7.   

    如果只关闭con,不关闭rs这样并不会有问题。因为con一关,由于rs、ps都要由con来的,所以con一关,rs、ps也会退出占有的资源,但是,如果在同一个conn中,要操作的ps、rs很多,操作完一个再去操作另一个,而且都不关,那这一次的操作将占用很多的资源,会很慢。严重时会出错!
      

  8.   

    只关闭con会出错,什么错误忘了,我刚试了试错误没有重现
      

  9.   


    如果你一个connection 开了 N个rs或ps而里面又不是用一次rsps关一次rsps的话,最后系统会报 “打开的游标超过最大数量”的错误。不信可以
    Connection con = ....
    Statement st = ....
    ResultSet rs = ...
    for(int i=0;i<10000;i++){
       rs=st.executeUpdate(sql);
    }...试试看。oracle默认300。i跑到301,咯屁。
      

  10.   

    java技术学习群100756746,希望大家加入,我们共同讨论,共同进步!
      

  11.   

    java技术学习群100756746,希望大家加入,我们共同讨论,共同进步!
      

  12.   

    一次操作中不会开太多的rs和stmt,所以楼上的很多假设都不成立!
    我只是在前几天写代码的时候突然想到为什么要在 finally里依次关闭rs,stmt,conn呢,直接关掉conn不就得了?
    从api上看,如果关闭stmt那么rs也就关闭了(<B>Note: </B>When a <code>Statement </code> object is
        * closed, its current <code>ResultSet </code> object, if one exists, is
        * also closed.  
    ),但是好像没有地方说关闭conn的话,stmt也会被关闭,所以上来问下,day day up .
    还有16楼说的
    “如果只关闭con,不关闭rs这样并不会有问题。因为con一关,由于rs、ps都要由con来的,所以con一关,rs、ps也会退出占有的资源”  这个话是否有依据  ?
      

  13.   

    我知道写程序要养成好习惯,但是假设直接关conn就可以的话,那么你所谓的好习惯就是要多写很多“臃余”代码嘛 ?
      

  14.   

    还有16楼说的 
    “如果只关闭con,不关闭rs这样并不会有问题。因为con一关,由于rs、ps都要由con来的,所以con一关,rs、ps也会退出占有的资源”  这个话是否有依据  ? 
    ----------------------------------------------------
    只是关了conn拿不到rs和ps了 但不见得会回收已创建的rs和ps对象吧 
      

  15.   

    按顺序关吧 ResultSet  Statement Connection
      

  16.   

    try {}catch (Exception e) {
      }finally {
      try {
         rs.close() ;
         ps.close() ;
         conn.close() ;
      }catch(Exception e) {
       
      }}每打开一个连接就像打开一闪门一样。
    而conn 是最外的一闪门。以次往里。 --ps --rs
    而当你出来的时候一定要有礼貌的一闪一闪的把门关掉。虽然把最外的门一关就什么都没有了。
    可是程序看起来就一点也不健壮。有好的习惯吧。 
      

  17.   

    只关闭其中的一个或两个而不全部关闭的话,从资源的利用讲是不合理利用资源,如果不关闭,下次再访问时有可能就会很慢
    建议LZ都关闭 并按顺序依次关闭: 
    rs.close(); 
    ps.close(); 
    con.close(); 
      

  18.   

       最好都关了吧。。
       JDBC最好就是它的效率了,如果你有对象不光的话会影响效率的
        在说关一下举手之劳而已
      

  19.   

    比较完美的关闭:
    try{
    if(rs != null)
    rs.close();
    }catch(Exception e){
    e.printStackTrace();
    }finally{
    try{
    if(prs != null)
    prs.close();
    }catch(Exception e){
    e.printStackTrace();
    }finally{
    try{
    if(con != null)
    con.close();

    }catch(Exception e){
    e.printStackTrace();
    }
    }
    }
      

  20.   

    学习了,结论是三个最好都关闭,依打开顺序倒序关闭,并且要分别包在try catch 中,他们每个都有可能出错。记得前阵子有篇拿上茅房作例子解说jdbc close的文章,也挺有趣的。
    ......
    finally {
    try  {
      rs.close();
    } catch (SQLException e) {
      //dosth
    }
    try  {
      pstmt.close();
    } catch (SQLException e) {
      //dosth
    }
    try  {
      con.close();
    } catch (SQLException e) {
      //dosth
    }
      

  21.   

    33楼的代码还可以,不过可以肯定
    try  {
      rs.close();
    } catch (SQLException e) {
      //dosth
    }
    这个就不用要了,还有34说的是没有必要的,如果是空那就更不用关了,即使出异常也不会影响下面的关闭。还有那个说完美的那个,你的代码写的真是“完美”.
      

  22.   

    rs.close(); 
    ps.close(); 
    con.close(); 
    如果对软件架构不熟悉的话,最好资源使用完,就关掉,垃圾回收机制是要在特定环境因素下才会主动去做回收动作的。
      

  23.   

    只关闭Connection,在SQL SERVER下不会有问题,但是在Oracle下用一段时间后会报超出游标数其他数据库不知
      

  24.   

    一定要按顺序关闭rs stat conn如果直接使用DriverManager.getConnect的,没有太大影响但是如果使用连接池,那么conn.close实际上并没有关闭连接,只是将连接放回池中。结果rs和stat就没有一直关闭了。数据库到最后就会报错
      

  25.   

    PrepareStatement 也并没有关系 因为连接池会对PrepareStatement进行缓存 
    PrepareStatement 会进行预编译SQL语句 优化性能
      

  26.   

    JVM有自己的回收算法,垃圾回收机制是要在特定环境因素下才会主动去做回收动作的