诚心求教,如何关闭JDBC中一个connection的所有resultset和statement

stone198305 2007-06-20 10:22:37
请问各位,如何关闭JDBC中一个connection的所有resultset和statement

我知道直接关闭connection也可以实现,但是因为我的程序需要不停的操作数据库,是一个电信项目,所以connection要一直保持,不去关闭它,不然开销太大,而且因为需要频繁的创建resultset和statement,如果一个个关闭太麻烦了,能否在一个操作循环完后,在一个地方关闭掉一个connection的所有resultset和statement呢?

...全文
1640 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
leetao881212 2011-03-25
  • 打赏
  • 举报
回复
直接返回ResultSet是不推荐的
应该根据自己的需求封装自己需要的数据类型,作为返回类型
这样就可以在返回之前关闭ResultSet
JIESA 2011-03-25
  • 打赏
  • 举报
回复
其实我也一直在找楼主说的解决方案
并且想通过代理接口的方式实现
后来发现不妥,只好放弃了,
因为Connection生成的Statement和ResultSet始终不释放,
而是到最后才释放,可能会达到数据库联接的最大游标数而导致错误
例如:
try{
rs1 = stmt.executeSql(sql1);
while(rs1.next()){...}

rs2 = stmt.executeSql(sql2);
while(rs2.next()){...}
...

rs100 = stmt.executeSql(sql4);
while(rs100.next()){...}

}catch(Exception){}
finally{
closeDBSourse(rs1);//1
closeDBSourse(rs2);//2
...
closeDBSourse(rs100);//100
//1-100可能封装在函数101中

freeDBSourse(stmt);//101
}
可能在执行过程中会占用多个数据库游标,存在隐患。
目前我采用的实现方式如下,虽然比较繁琐,但很安全:
try{
rs1 = stmt.executeSql(sql1);
while(rs1.next()){...}
closeDBSourse(rs1);

rs2 = stmt.executeSql(sql2);
while(rs2.next()){...}
closeDBSourse(rs2);
...

rs100 = stmt.executeSql(sql4);
while(rs100.next()){...}
closeDBSourse(rs100);

}catch(Exception){}
finally{
freeDBSourse(stmt);
}
clarck_913 2011-03-25
  • 打赏
  • 举报
回复
别返回ResultSet,这样调用方和你这个方法的耦合程度就太高了

而且,你在你的方法里没法释放资源啊。

zxl_long 2007-09-19
  • 打赏
  • 举报
回复
还是在哪儿用到STATEMENT,RESULTSET就在哪儿关闭比较好吧
  • 打赏
  • 举报
回复
晕啊~~这个帖子是三个月前的!!
  • 打赏
  • 举报
回复
public ResultSet executeSql(String sqlstr){}

我认为像这样的设计就很不合理,至少返回的是一个封装后的数据(如:List),而不是直接返回一个 ResultSet,而且 finally 是先执行的(在其中关闭了 ResultSet),这个再返回就得不到结果集了。

这个方法应该改为:

public List<xxxx> executeSql(String sqlstr){}

这样就可以在里面直接关掉了。
shengli_liao 2007-09-19
  • 打赏
  • 举报
回复
其实我也一直在找楼主说的解决方案
并且想通过代理接口的方式实现
后来发现不妥,只好放弃了,
因为Connection生成的Statement和ResultSet始终不释放,
而是到最后才释放,可能会达到数据库联接的最大游标数而导致错误
例如:
try{
rs1 = stmt.executeSql(sql1);
while(rs1.next()){...}

rs2 = stmt.executeSql(sql2);
while(rs2.next()){...}
...

rs100 = stmt.executeSql(sql4);
while(rs100.next()){...}

}catch(Exception){}
finally{
closeDBSourse(rs1);//1
closeDBSourse(rs2);//2
...
closeDBSourse(rs100);//100
//1-100可能封装在函数101中

freeDBSourse(stmt);//101
}
可能在执行过程中会占用多个数据库游标,存在隐患。
目前我采用的实现方式如下,虽然比较繁琐,但很安全:
try{
rs1 = stmt.executeSql(sql1);
while(rs1.next()){...}
closeDBSourse(rs1);

rs2 = stmt.executeSql(sql2);
while(rs2.next()){...}
closeDBSourse(rs2);
...

rs100 = stmt.executeSql(sql4);
while(rs100.next()){...}
closeDBSourse(rs100);

}catch(Exception){}
finally{
freeDBSourse(stmt);
}
shengli_liao 2007-09-19
  • 打赏
  • 举报
回复
这个方法应该改为:
public List<xxxx> executeSql(String sqlstr){}
=============================================
怎么实现这个方法呢?
ResultSet中返回的各字段属性不知道呀
是不是每个查询都要写一个这种方法,这可能要累死人
stone198305 2007-06-25
  • 打赏
  • 举报
回复
to:jihanzhong(逍遥)

一个connection能带好多有效的resultset和statement吗?


应该可以,我程序里一个connection就带了好多resultset和statement,但是都能返回正确的结果
jihanzhong 2007-06-25
  • 打赏
  • 举报
回复
疑问:
一个connection能带好多有效的resultset和statement吗?

我怎么觉得只能1拖1 的?
stone198305 2007-06-25
  • 打赏
  • 举报
回复
wang_wei2007()

如果是因为有循环嵌套不能关的,就封闭到集合中再循环

什么意思?能具体说说吗?比如
rs3 = this.Conn1.executeSql(sql3);
try{
while(rs3.next()){
........
rs4 = this.Conn1.executeSql(sql4);

try{
while(rs4.next()){

.........
}catch(){

}
}
}catch(){

}
这样一段代码的关闭代码应该怎么写?
sjsy22301 2007-06-23
  • 打赏
  • 举报
回复
世纪书缘时隔两年多,《Java编程思想(第4版)》的中文版又要和广大Java程序员和爱好者们见面了。这是Java语言本身不断发展和完善的必然要求,也是本书作者Bruce Eckel孜孜不倦的创作激情和灵感所结出的硕果。

《Java编程思想(第4版)》以Java最新的版本JDK5.0为基础,在第3版的基础上,添加了最新的语言特性,并且对第3版的结构进行了调整,使得所有章节的安排更加遵照循序渐进的特点,同时每一章的内容在分量上也都更加均衡,这使读者能够更加容易地阅读本书并充分了解每章所讲述的内容。在这里我们再次向Bruce Eckel致敬,他不但向我们展示了什么样的书籍才是经典书籍,而且还展示了经典书籍怎样才能精益求精,长盛不衰。

Java已经成为了编程语言的骄子。我们可以看到,越来越多的大学在教授数据结构、程序设计和算法分析等课程时,选择以Java语言为载体。这说明Java语言已经是人们构建软件系统时主要使用的一种编程语言。但是,掌握好Java语言并不是一件可以轻松完成的任务,如何真正掌握Java语言,从而编写出健壮的、高效的以及灵活的程序是Java程序员们面临的重大挑战。

《Java编程思想(第4版)》就是一本能够让Java程序员轻松面对这一挑战,并最终取得胜利的经典书籍。本书深入浅出、循序渐进地把我们领入Java的世界,让我们在不知不觉中就学会了用Java的思想去考虑问题、解决问题。本书不仅适合Java的初学者,更适合于有经验的Java程序员,这正是本书的魅力所在。但是,书中并没有涵盖Java所有的类、接口和方法,因此,如果你希望将它当作Java的字典来使用,那么显然就要失望了。

我们在翻译本书的过程中力求忠于原著,为了保持连贯性,对原书第3版中仍然保持不变的部分,我们对译文除了个别地方之外,也没做修改。对于本书中出现的大量的专业术语尽量遵循标准的译法,并在有可能引起歧义之处注有英文原文,以方便读者对照与理解。

全书由陈昊鹏翻译,郭嘉也参与了部分翻译工作。由于水平有限,书中出现错误与不妥之处在所难免,恳请读者批评指正。www.sjsy.net

转载
jspxnet 2007-06-22
  • 打赏
  • 举报
回复
用连接池,apache 的,c3p0 的都不错。

你也可以试试这个是我些的
http://www.jspx.net/down/lib/jspxdbs-1.0.jar

<bean id="jspxDataSource" class="com.jspx.datasource.JspxDataSource" destroy="close">
<string name="driverClass">${driverClassName}</string>
<string name="jdbcUrl"><![CDATA[${jdbcUrl}]]></string>
<string name="user">${username}</string>
<string name="password">${password}</string>
</bean>

当你关闭的时候它不会关闭,当没有使用连接的时候会自动关闭连接。
setMaxPoolSize 设置最大连接数。
setMaxConnectionTime 最大连接等待时间,单位毫秒,超过这个时间就关闭。


wang_wei2007 2007-06-22
  • 打赏
  • 举报
回复
既然return rs,返回了结果集,就不能在finally中把rs.close()掉,return之前会执行finally里的内容

rs用完就关,如果是嫌麻烦就自己写个函数一起关,如果是因为有循环嵌套不能关的,就封闭到集合中再循环

谁调用了executeSql方法就由谁关
stone198305 2007-06-22
  • 打赏
  • 举报
回复
不是3,4句,我的程序因为操作数据库比较多,得有10几句哈

而且有的时候还不好关闭,比如
rs3 = this.Conn1.executeSql(sql3);
try{
while(rs3.next()){
........
rs4 = this.Conn1.executeSql(sql4);

try{
while(rs4.next()){

.........
}catch(){

}
}
}catch(){

}
请问上面这段怎么关闭statment和resultset?其中this.Conn1是和一个数据库的连接,对这个数据库嵌套做了操作,如果里层的while(rs4.next())关闭了statment和resultset,会不会影响外层的while(rs3.next())而使外层的循环不能在继续了
xdw555 2007-06-22
  • 打赏
  • 举报
回复
rs用完就关,
没有那种关所有rs和sm的方法.
既然在循环里面就3,4句话都懒得写...
stone198305 2007-06-22
  • 打赏
  • 举报
回复
顶,希望还有高人可以指教
rumlee 2007-06-22
  • 打赏
  • 举报
回复
不过我觉得这种方法不是很好的方法,最好的方法就是在不用的时候就关闭掉,哪个方法打开的就要哪个方法关闭掉,保证各个方法之间松耦合,否则在一个稍微大一点的项目或者甚至是多线程的项目中,谁都无法预料会出现什么样的结果。
rumlee 2007-06-22
  • 打赏
  • 举报
回复
建议自己实现一个Connection接口的类,然后里面封装一个Connection对象,然后自己实现一下CreateStatement方法,除了创建Statement外,把所有的Statement放在一个列表里面,增加一个关闭所有Statement方法,把列表里面的所有的Statement全部关闭掉。
stone198305 2007-06-22
  • 打赏
  • 举报
回复
自己顶
加载更多回复(13)

62,623

社区成员

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

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