找高手请教ResultSet的rs对象该在何处rs.close()

herowach 2006-08-07 05:58:27
在用到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()方法,程序才会正常运行,但是不关总觉得不好,困惑....

...全文
729 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
herowach 2006-08-09
  • 打赏
  • 举报
回复
怎么结帖哦~~~~~
herowach 2006-08-08
  • 打赏
  • 举报
回复
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对象了,这样做规范吗?


lbx19822004 2006-08-08
  • 打赏
  • 举报
回复
try{
...
}catch(Exception e){
...
}finally{
rs1.close();
rs2.close();
}
最好都在finally块中关闭。
hbwhwang 2006-08-08
  • 打赏
  • 举报
回复
用2个statement吧。好像用1个的时候是有这个问题
JavaHurricane 2006-08-08
  • 打赏
  • 举报
回复
这个问题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存在的话
c366oem 2006-08-08
  • 打赏
  • 举报
回复
正确的写法
try{
...
}catch(Exception e){
...
}finally{
try{
rs1.close();
}catch(Exception ee){}

try{
rs1.close();
}catch(Exception ee){}

}



不要闲麻烦,如果闲麻烦就用spring+hibernate了,就不用管数据库连接开关释放等问题了.容器管理了
pdw2009 2006-08-08
  • 打赏
  • 举报
回复
finally{在此关闭}
herowach 2006-08-08
  • 打赏
  • 举报
回复
还问一个:
ResultSet对象关闭后,有必要置NULL吗?
怎么我看到有些代码是
rs.close();
rs = null;
有必要这样做吗?

还有声明了一个ResultSet rs;后
用完一个rs后关闭了(rs.close()),能不能在用rs = stmt.execute("sql");取另一个记录集?
而不重新定义个ResultSet对象了,这样做规范吗?
terryxym 2006-08-08
  • 打赏
  • 举报
回复
用完就关
别浪费资源啊
herowach 2006-08-08
  • 打赏
  • 举报
回复
我是菜鸟,可能真的是我书写顺序的问题造成的吧,有交叉的现在想想好象是可以避免,象上面的例子, 先关rs1,再关rs2,相当于rs2整包含了rs1是吗?整包含一般就不会抛NullpointException了吗?
jspxnet 2006-08-08
  • 打赏
  • 举报
回复
打开 读完数据马上 就关

try{
...
}catch(Exception e){
...
}finally{
rs1.close();
rs2.close();
}
weinickli 2006-08-08
  • 打赏
  • 举报
回复
不知道你为什么要有交叉~~~
有交叉说明你写的东西没有层次~。。。
herowach 2006-08-08
  • 打赏
  • 举报
回复
xiaoqulai(肖曲来)
有些时候却是必须要在rs1.next()成立的情况下才执行rs2.next()的啊,遇到过多次这样的问题了,如查一个表是否有指定记录,有就对另一个表查另一条指定记录,有就删除或更新,没有就另一中方案,有时候会有3个ResultSet对象有交叉的地方哦,总是抛NullpointException,只要注释掉rs.close(),就不会抛这个异常了,但是不关ResultSet对象感觉不对。

但我没试过用多个statement,习惯了用一个statement创建多个ResultSet对象了,难道真的要一个ResultSet对应一个statement吗,那不是很麻烦哦!~~~~
whysdhr 2006-08-08
  • 打赏
  • 举报
回复
我认为是用完ResultSet对象以后就关闭它.
凋零的老树 2006-08-08
  • 打赏
  • 举报
回复
尽量避免交叉,而且很少遇到不能避免的
zhmt 2006-08-08
  • 打赏
  • 举报
回复
up!..............mark!
cyeahpro 2006-08-08
  • 打赏
  • 举报
回复
有异常抛出一定用try{}catch处理
资源关闭一定放在finally里面处理
rickyelf 2006-08-08
  • 打赏
  • 举报
回复
最好不要在循环中再去连接数据库,这样很麻烦的,会有想不到的结果出现
把程序的逻辑再理理,清晰简单点比较好
JavaHurricane 2006-08-08
  • 打赏
  • 举报
回复
Statement关闭会导致ResultSet关闭

如果一定要传递ResultSet,应该使用RowSet
RowSet可以不依赖于Connection和Statement

Java传递的是引用,所以如果传递ResultSet
你会不知道Statement和Connection何时关闭
不知道ResultSet何时有效。
JavaHurricane 2006-08-08
  • 打赏
  • 举报
回复
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对象了,这样做规范吗?
答:可以这么做,但是不规范
你要充分优化规范你的代码,一般出现这种情况,我们可以写在两个方法里来避免这种情况





加载更多回复(13)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧