在用到ResultSet的时候,总不知道在何处关闭是最好的,特别是当多个rs有交叉的地方的时候,总是不知道怎么关闭。
例如:
String sql1 = "***";    //数据库查询语句
ResultSet rs1 = stmt.executeQuery(sql1);
ResultSet rs2; 
if(rs1.next())
{
    rs1.close();  //rs1不需要用了
    String sql2 = "***";
    rs2 = stmt.executeQuery(sql2);
    if(rs2.next())
    {
        ****
    }
    }
//rs.getInt(**);  有时候是rs与rs间包含,有时候是只覆盖一部分就是象这样多几层查询的时候,和该在何时关闭,我平时关闭时总是抛空指针异常,只要不写.close()方法,程序才会正常运行,但是不关总觉得不好,困惑....

解决方案 »

  1.   

    有人遇到过这样的问题么,ResultSet对象关闭地方不对造成的NullpointException.
      

  2.   

    一个原则 你确定不再需要读数据了 就可以close关的动作最好放在finally里面
      

  3.   

    理论上是要在finally里面执行关闭的
      

  4.   

    方法一:用不同的stmt对象,然后在关闭的时候,将它们都关闭,先关rst,再关闭stmt;
    方法二:在你上面的代码看起来很别扭,为什么不这样写:
    if(rs1.next())
    {
        rs1.close();  //rs1不需要用了
    }String sql2 = "***";
    rs2 = stmt.executeQuery(sql2);
    if(rs2.next())
    {
        ****
    }
      

  5.   

    最好在异常处理的finally里面关闭,顺序是先Result,在Statement,最后数据库连接Connection
      

  6.   

    用2个statement吧。好像用1个的时候是有这个问题
      

  7.   

    try{
      ...
    }catch(Exception e){
      ...
    }finally{
        rs1.close();
        rs2.close();
    }
    最好都在finally块中关闭。
      

  8.   

    我认为是用完ResultSet对象以后就关闭它.
      

  9.   

    xiaoqulai(肖曲来)
    有些时候却是必须要在rs1.next()成立的情况下才执行rs2.next()的啊,遇到过多次这样的问题了,如查一个表是否有指定记录,有就对另一个表查另一条指定记录,有就删除或更新,没有就另一中方案,有时候会有3个ResultSet对象有交叉的地方哦,总是抛NullpointException,只要注释掉rs.close(),就不会抛这个异常了,但是不关ResultSet对象感觉不对。但我没试过用多个statement,习惯了用一个statement创建多个ResultSet对象了,难道真的要一个ResultSet对应一个statement吗,那不是很麻烦哦!~~~~
      

  10.   

    打开 读完数据马上 就关 

    try{
    ...
    }catch(Exception e){
    ...
    }finally{
    rs1.close();
    rs2.close();
    }
      

  11.   

    我是菜鸟,可能真的是我书写顺序的问题造成的吧,有交叉的现在想想好象是可以避免,象上面的例子, 先关rs1,再关rs2,相当于rs2整包含了rs1是吗?整包含一般就不会抛NullpointException了吗?
      

  12.   

    还问一个:
    ResultSet对象关闭后,有必要置NULL吗?
    怎么我看到有些代码是
    rs.close();
    rs = null;
    有必要这样做吗?还有声明了一个ResultSet rs;后
    用完一个rs后关闭了(rs.close()),能不能在用rs = stmt.execute("sql");取另一个记录集?
    而不重新定义个ResultSet对象了,这样做规范吗?
      

  13.   

    正确的写法
    try{
      ...
    }catch(Exception e){
      ...
    }finally{
     try{
         rs1.close();
     }catch(Exception ee){} try{
        rs1.close();
     }catch(Exception ee){}}不要闲麻烦,如果闲麻烦就用spring+hibernate了,就不用管数据库连接开关释放等问题了.容器管理了
      

  14.   

    这个问题Sun公司曾经提到过
    原文如下:
    The object used for executing a static SQL statement and returning the results it produces. By default, only one ResultSet object per Statement object can be open at the same time. Therefore, if the reading of one ResultSet object is interleaved with the reading of another, each must have been generated by different Statement objects. All execution methods in the Statement interface implicitly close a statment's current ResultSet object if an open one exists.它的意思很明显~
    一个Statmenet多个ResultSet进行操作
    那么从stmt得到的ResultSet1
    必须马上操作此ResultSet1后
    才能去得到另外的ResultSet2
    再对ResultSet2操作不能互相交替使用
    会引起ResultSet已经关闭错误在默认的情况下
    一个ResultSet对应一个ResultSet
    所有的执行Statment的方法暗中会关闭一个Statment的ResultSet前提是如果这个ResultSet存在的话
      

  15.   

    JavaHurricane(Java飓风) 
    [一个Statmenet多个ResultSet进行操作
    那么从stmt得到的ResultSet1
    必须马上操作此ResultSet1后
    才能去得到另外的ResultSet2
    再对ResultSet2操作]但实际中大多数都会遇到同时要用到2个ResultSet对象的情况啊,这里解决的方法最好是一个ResultSet的范围整体包含另一个ResultSet对象的范围还是为2个ResultSet对象各自建立一个statement对象呢? 哪个更好点?还有一个:
    ResultSet对象关闭后,有必要置NULL吗?
    怎么我看到有些代码是
    rs.close();
    rs = null;
    有必要这样做吗?还有声明了一个ResultSet rs;后
    用完一个rs后关闭了(rs.close()),能不能在用rs = stmt.execute("sql");取另一个记录集?
    而不重新定义个ResultSet对象了,这样做规范吗?
      

  16.   

    这个问题要看你的应用了首先这是一个三方面的问题,应该在加上一个对象Connection为什么呢?
    显式的调用Connection的close能够更快的释放数据库资源
    因为当我们调用connection.close()的时候
    会自动释放Statment和ResultSet资源statement.close()自动导致ResultSet对象无效
    注意只是 ResultSet 对象无效
    ResultSet 所占用的资源可能还没有释放特别是在使用connection pool的时候
    connection.close并不会导致物理连接的关闭
    不执行ResultSet的close可能会导致更多的资源泄露Sun有文如下:
    An application calls the method Statement.close to indicate that it has finished processing a statement. 
    All Statement objects will be closed when the connection that created them is closed. 
    However, it is good coding practice for applications to close statements as soon as they have finished processing them. 
    This allows any external resources that the statement is using to be released immediately.
    Closing a Statement object will close and invalidate any instances of ResultSet produced by that Statement object. 
    The resources held by the ResultSet object may not be released until garbage collection runs again, so it is a good practice to explicitly close ResultSet objects when they are no longer needed.
    These comments about closing Statement objects apply to PreparedStatement and CallableStatement objects as well.
      

  17.   

    finally{
        if(rs == null){
            rs.close();
        }
    }
      

  18.   

    错啦,是
    finally{
        if(rs != null){
            rs.close();
        }
    }
      

  19.   

    nopo_nnd() 
    说的是判断,我想知道的是ResultSet 对象关闭后是不是已经是NULL了,
    照你那种写法就是:
    finally{
        if(rs != null){
            rs.close();
            rs = null;          //这步有必要吗?
        }
    }
      

  20.   

    herowach() ( ) 信誉:100  2006-08-08 12:22:00  得分: 0  
     
     
       JavaHurricane(Java飓风) 
    [一个Statmenet多个ResultSet进行操作
    那么从stmt得到的ResultSet1
    必须马上操作此ResultSet1后
    才能去得到另外的ResultSet2
    再对ResultSet2操作]但实际中大多数都会遇到同时要用到2个ResultSet对象的情况啊,这里解决的方法最好是一个ResultSet的范围整体包含另一个ResultSet对象的范围还是为2个ResultSet对象各自建立一个statement对象呢? 哪个更好点?答:规范起见,使用一个Statement对应一个ResultSet
        还有一个:
    ResultSet对象关闭后,有必要置NULL吗?
    怎么我看到有些代码是
    rs.close();
    rs = null;
    有必要这样做吗?答:有必要这么做,可能会有人说,rs.close()之后 ResultSet会被释放
         其实并不如此,如果ResultSet不置为null,会引起内存泄露,可能在小系统里短时间看不出什么问题,但是长时间或者大系统多访问量时就会引起内存泄露。
    还有声明了一个ResultSet rs;后
    用完一个rs后关闭了(rs.close()),能不能在用rs = stmt.execute("sql");取另一个记录集?
    而不重新定义个ResultSet对象了,这样做规范吗?
    答:可以这么做,但是不规范
        你要充分优化规范你的代码,一般出现这种情况,我们可以写在两个方法里来避免这种情况  
     
      

  21.   

    Statement关闭会导致ResultSet关闭如果一定要传递ResultSet,应该使用RowSet
    RowSet可以不依赖于Connection和StatementJava传递的是引用,所以如果传递ResultSet
    你会不知道Statement和Connection何时关闭
    不知道ResultSet何时有效。
      

  22.   

    有异常抛出一定用try{}catch处理
    资源关闭一定放在finally里面处理