JDBC关闭问题

hl_ghost 2009-12-16 11:03:30
如果我在一个程序中同时用Connection,PrepareStatement,ResultSet,应该如何关闭这些资源 ?

我只关闭Connection而不关闭其他两个会怎样?
我只关闭Connection,PrepareStatement而不关闭ResultSet会怎样?
...全文
613 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
wenjjing2lianee 2009-12-18
  • 打赏
  • 举报
回复
JVM有自己的回收算法,垃圾回收机制是要在特定环境因素下才会主动去做回收动作的






reanfan 2009-12-18
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 chdw 的回复:]
一定要按顺序关闭rs stat conn

如果直接使用DriverManager.getConnect的,没有太大影响

但是如果使用连接池,那么conn.close实际上并没有关闭连接,只是将连接放回池中。结果rs和stat就没有一直关闭了。数据库到最后就会报错
[/Quote]
PrepareStatement 也并没有关系 因为连接池会对PrepareStatement进行缓存
PrepareStatement 会进行预编译SQL语句 优化性能
sean1203 2009-12-18
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 chdw 的回复:]
一定要按顺序关闭rs stat conn

如果直接使用DriverManager.getConnect的,没有太大影响

但是如果使用连接池,那么conn.close实际上并没有关闭连接,只是将连接放回池中。结果rs和stat就没有一直关闭了。数据库到最后就会报错
[/Quote]
恩,不错
ChDw 2009-12-18
  • 打赏
  • 举报
回复
一定要按顺序关闭rs stat conn

如果直接使用DriverManager.getConnect的,没有太大影响

但是如果使用连接池,那么conn.close实际上并没有关闭连接,只是将连接放回池中。结果rs和stat就没有一直关闭了。数据库到最后就会报错
laker_914 2009-12-18
  • 打赏
  • 举报
回复
只关闭Connection,在SQL SERVER下不会有问题,

但是在Oracle下用一段时间后会报超出游标数

其他数据库不知
hl_ghost 2009-12-18
  • 打赏
  • 举报
回复
还有说话怎么也得有根据吧,技术板块灌水可耻.



xsm 2009-12-18
  • 打赏
  • 举报
回复
rs.close();
ps.close();
con.close();


如果对软件架构不熟悉的话,最好资源使用完,就关掉,垃圾回收机制是要在特定环境因素下才会主动去做回收动作的。
hl_ghost 2009-12-18
  • 打赏
  • 举报
回复
33楼的代码还可以,不过可以肯定
try {
rs.close();
} catch (SQLException e) {
//dosth
}
这个就不用要了,还有34说的是没有必要的,如果是空那就更不用关了,即使出异常也不会影响下面的关闭。

还有那个说完美的那个,你的代码写的真是“完美”.

caibw 2009-12-17
  • 打赏
  • 举报
回复
本分写代码,如果你忽悠代码,最后是代码忽悠!
xuqi2850661 2009-12-17
  • 打赏
  • 举报
回复
按顺序关吧 ResultSet Statement Connection
f117ff 2009-12-17
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 mawentao728 的回复:]
java技术学习群100756746,希望大家加入,我们共同讨论,共同进步!
[/Quote]
还有16楼说的
“如果只关闭con,不关闭rs这样并不会有问题。因为con一关,由于rs、ps都要由con来的,所以con一关,rs、ps也会退出占有的资源” 这个话是否有依据 ?
----------------------------------------------------
只是关了conn拿不到rs和ps了 但不见得会回收已创建的rs和ps对象吧
hl_ghost 2009-12-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 happygao521 的回复:]
最好就是按着反向顺序都关了,要有良好的编程习惯
[/Quote]
我知道写程序要养成好习惯,但是假设直接关conn就可以的话,那么你所谓的好习惯就是要多写很多“臃余”代码嘛 ?
hl_ghost 2009-12-17
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 crazylaa 的回复:]
如果你一个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,咯屁。
[/Quote]
一次操作中不会开太多的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也会退出占有的资源” 这个话是否有依据 ?


Trinx 2009-12-17
  • 打赏
  • 举报
回复
java技术学习群100756746,希望大家加入,我们共同讨论,共同进步!
Trinx 2009-12-17
  • 打赏
  • 举报
回复
java技术学习群100756746,希望大家加入,我们共同讨论,共同进步!
f117ff 2009-12-17
  • 打赏
  • 举报
回复
那如果并发访问量很大的话 你不能及时关闭该关的资源 你说会怎么样
良好的习惯 逆序依次关闭
super_sealOne 2009-12-17
  • 打赏
  • 举报
回复
关闭之前要进行空指针判断
dinghun8leech 2009-12-17
  • 打赏
  • 举报
回复
学习了,结论是三个最好都关闭,依打开顺序倒序关闭,并且要分别包在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
}
etoak 2009-12-17
  • 打赏
  • 举报
回复
比较完美的关闭:
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();
}
}
}
TzSword 2009-12-17
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 vip_soft 的回复:]
引用楼主 hl_ghost 的回复:
如果我在一个程序中同时用Connection,PrepareStatement,ResultSet,应该如何关闭这些资源 ?

我只关闭Connection而不关闭其他两个会怎样?
我只关闭Connection,PrepareStatement而不关闭ResultSet会怎样?


只关闭其中的一个或两个而不全部关闭的话,从资源的利用讲是不合理利用资源,如果不关闭,下次再访问时有可能就会很慢
建议LZ都关闭 并按顺序依次关闭:
rs.close();
ps.close();
con.close();
[/Quote]
最好都关了吧。。
JDBC最好就是它的效率了,如果你有对象不光的话会影响效率的。。。
在说关一下举手之劳而已
加载更多回复(22)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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