两个rs是指向同一个!
一般来说,不在resultset做更新操作的话,获得结果集就应该关闭。而在jsp的最后关闭连接。

解决方案 »

  1.   

      我想应该是这样,应该在bean中调用rs.close,关闭数据库连接.但是这样做的目的不是释放rs对象,因为我觉得java因为有垃圾对象自动回收功能,所以对于过期的对象我们可以不管,但是数据库连接是没有办法自动关闭的,所以需要rs.close来关闭.
      

  2.   

    然后在jsp页面中显式调用该方法freeRS()释放javaBean中的rs呢?当然可以啦。
      

  3.   

    你这样作是不是connect数量会增加的?
    请问你是怎么看rs有没有关闭?
    我用jdbc连sybase的时候,
    是看网络连接数的,也就是connect的数量。
    是不是有必要conn.close();
      

  4.   

    您必须用EntityBean 操作database connect.
    再用sessionBean  操作EntityBean,这样就不会有问题了
      

  5.   

    to:ycats(加菲猫) 
    两个rs是不一样的!,不信你可以自己测试一下,我测试过了的。to:wind13(菩提树)
    但我觉得运行jsp,JavaBean的容器好像不会马上收集的,好像等到服务停止才做回收处理,我现在就是不能确定这个问题,请看我原文,我曾碰到过的错误信息,“..超出最大游标数” ,怎么解释?to:skyyoung(路人甲)
    我是说有没有必要,我当然知道可以那样做,当你有没有考虑到,每个jsp页面都要做这一步,无疑是增加的工作量。如果可以不加freeRS()管理就容易多了。to:hymmyh(羽) 
    我是用连接池来获得connection的,然后JavaBean调用连接池里的connection,使用完了就返还给连接池的,所以连接数上不用担心有问题。
    现在问题焦点是JavaBean中的rs,是否需要显式关闭,服务器会不会自动管理我在JavaBean中没有显式关闭的rs(我现在用Tomcat做服务器),也就是说,如果会自动关闭的话,我就没有必要在javaBean中增加freeRS()做显式关闭rs了。大家请看看我的源码,我这里做了调试测试的
    package DBTools;import java.io.*;
    import java.sql.*;
    import DBTools.PoolManager;public class ExecuteQueryBean {  private ResultSet rs;
      private Statement stmt;
      private PoolManager poolMgr;
      private Connection conn;  public ExecuteQueryBean() {
        poolMgr = PoolManager.getInstance();
      }  public ResultSet executeQry(String sql) {
        rs = null;
        try {
          conn = poolMgr.getConnection("mysql");
          stmt = conn.createStatement();
          if (rs==null) {
    System.out.println("");
    System.out.println("\n\n[ "+ new java.util.Date()+" ]  rs=null   init now !  --------");
          }
          else {
    System.out.println("");
    System.out.println("[ "+new java.util.Date()+" ] rs!=null -----------------");
          }
          rs = stmt.executeQuery(sql);
          stmt.close();
          System.out.println("RS new         A**************************");
          poolMgr.freeConnection("mysql",conn);
        }
        catch (SQLException e) {
        }
        return rs;
        //注意:这里并没有调用rs.close();
      }  public void freeRS() {
        try {
          if (rs != null) {
    rs.close();
    System.out.println("freeRS() ....RS CLOSE()~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
          }
          else {
    System.out.println("freeRS()....rs ========================null");
          }
        }
        catch(SQLException e) {
          System.out.println("freeRS()....RS Close ERROR!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
        }
      }}
      

  6.   

    To ycats(加菲猫) 
    我是这样测试的,首先把Bean中的 rs 设定为static ,
    然后在jsp页面(源码如下)中调用该bean,然后刷新或者反复调用该jsp页面
    结果在输出的Debug信息:
    RS new         A**************************
    [ Sun Dec 30 12:37:23 CST 2001 ] rs!=null -----------------
    RS new         A**************************
    [ Sun Dec 30 12:37:51 CST 2001 ] rs!=null -----------------
    RS new         A**************************
    [ Sun Dec 30 12:37:52 CST 2001 ] rs!=null -----------------
    RS new         A**************************
    ……
    这样说名jsp里的rs.close()只是把jsp页面里的rs关闭了如果在jsp里加入显式调用的freeRS() 后,输出的Dubug信息如下:
    [ Sun Dec 30 12:39:43 CST 2001 ]  rs=null   init now !  --------
    RS new         A**************************
    [ Sun Dec 30 12:40:02 CST 2001 ]  rs=null   init now !  --------
    RS new         A**************************
    [ Sun Dec 30 12:40:02 CST 2001 ]  rs=null   init now !  --------
    ……//---test.jsp  -------------------------------------
    <%@ page contentType="text/html; charset=GBK" %>
    <%@ page language="java" import="java.sql.*" %>
    <html>
    <head>
    <title>
    test!
    </title>
    </head>
    <jsp:useBean id="ExeQry" scope="page" class="DBTools.ExecuteQueryBean" />
    <%
      ResultSet rs = ExeQry.executeQry("select * from my_test_table");
    %>
    <body>
    <h1>
    <%
      while (rs.next()) {
        out.print("<h1>"+rs.getString("test_column")+"</h1>");
      }
      rs.close();
      //ExeQry.freeRS();
    %>
    </h1>
    </body>
    </html>
      

  7.   

    结果集关闭不是rs=null!!是让她试放在数据库端的资源!(你在你的bean返回rs前执行rs.close())就知道啦。
    你把rs设成static的,它自然不会是null(类的静态变量没那么快回收);
      

  8.   

    在JAVABEAN中就应该将数据封装进业务对象中。
    你写的这个BEAN可以作为底层的通用数据库访问对象。
    举个例子吧。
    mydb<->user(entity)<->jsp(display user info)
        <->vector userlist(users)<->jsp(display user list)
    不是严谨的,但是思路基本上是这样的。
    因此CONNECTION和RECORDSET的资源问题就在底层就得到控制了。
      

  9.   

    use taglib,tag class invoke database access object and page tag get its output info by attribute.database objects manage all of the resources,create and release.
      

  10.   

    在javabean中加入方法finalize(),在里面释放掉rs以及其他资源
      

  11.   

    Java提供了一个名为finalize()的方法,可为我们的类定义它。在理想情况下,它的工作原理应该是这样的:一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用finalize(),而且只有在下一次垃圾收集过程中,才会真正回收对象的内存。所以如果使用finalize(),就可以在垃圾收集期间进行一些重要的清除或清扫工作。
    根据我的观察,在javabean的生命周期结束后,finalize是一定会被自动调用的,那么我们可以将一些系统不能自动释放的资源放在finalize()方法中调用例如数据库连接、socket连接等
    如:
    public void finalize() throws Throwable{
        rs.close();
        conn.close();
        super.finalize();}
      

  12.   

    to sSam: finalize()和c++中的析构函数不一样,它的执行时间是不确定的,而我们需要
    立即释放rs的资源。to 6leaf: 真搞不懂,executeQry中第一行就是 rs=null; 那你后面再判断有什么用?
      

  13.   

    所以加菲猫说的对,两个rs其实是一样的,再者根据javadoc的介绍,rs可以在
    stmt关闭的时候自动关闭,所以除了发生异常要显式关闭外,不用考虑那么详细
      

  14.   


    俺觉得应该在bean里把rs封装到String数组里,然后在bean里关闭rs,返回String数组
      

  15.   

    放假几天,今天才上来看,谢谢大家的指点!我会尽快给分的赞同gun4rose(gun4rose) 在Java中的finalize()和c++中的析构函数不一样,它的执行时间是不确定的,而我们需要立即释放rs的资源。这样对系统的性能大有好处。至于两个rs是否是同一个,我实在想不明白,还请大家说明一下原理,因为我觉得bean中的传递的是对象rs的一个引用,并不是Bean中的rs,这跟C++中的指针传送不一样吧
    rs=null  与 rs.close()  有什么区别?to gun4rose(gun4rose): 我在测试时把  rs=null那一行注释了的To ycats(加菲猫) :
      

  16.   

    To ycats(加菲猫) :按你的的意思“关闭结果集与关闭连接不同。关闭结果集事释放在数据库申请的游标等资源。 ”,那我之前碰到的一个超出游标数的错误信息,应该是因为没有释放rs,如果我现在要改进的话,按gun4rose(gun4rose) 的说法“者根据javadoc的介绍,rs可以在
    stmt关闭的时候自动关闭,所以除了发生异常要显式关闭外,不用考虑那么详细 ”,我是不是可以不用管rs的释放了(当然释放是最好的,但现在是作补救工作时,可省就省点了,呵呵)