数据库资源释放。。。讨论

100geOK 2005-05-11 01:42:37
服务器webshare
问题的引出:
在此之前有听说过一些关于连接池是如何管理的。这个根据不同的厂商实现的细节不同而不同。
我听说的有这些,一种是通过配置能够在自动的关闭释放资源,只需要配置好就行,当然需要你使用的连接池支持这种方式,另一种是必须要手动释放资源,否则数据库会因为这些资源未释放而导致崩溃。
现在我使用的是webshare服务器,查看后台的代码,发现preparedStatement都没有显示的关闭,Connection倒是关闭了。
我怎么知道我使用的连接池是否能够自动释放资源的呢?而使用那些包是支持自动关闭功能的?希望能够有人指引我一下,谢谢
...全文
223 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
DanielYWoo 2005-05-26
  • 打赏
  • 举报
回复
>>ChDw(米) ( )
>>你说没有被真正关闭,意思是与断开数据库连接与conn.close()是
>>两码事。刚才问了公司的架构师,他说是会说收的。不过他的意思
>>是conn.close()和断开数据库连接是一码事。可以再说说你的看法?
------------------------
你公司的architect简直胡说八道
连接池的连接是预先创建的保持连接,如果你从容器lookup datasource的连接是java.sql.Connection的一个特定容器封装,对这个conn.close()并不会物理关闭连接,只是清空游标,事物等等,并归还给连接池等待下次使用,从客户程序员的角度看,这些只是逻辑连接,不是物理连接。是容器维持着这些物理连接。

>>现在我使用的是webshare服务器,查看后台的代码,发现preparedStatement都没有显示的关闭,>>Connection倒是关闭了。
如果是Tomcat这种比较简单的服务器,很傻的,根本没有任何动作,要等连接过期才能归还给连接池。如果是WebLogic或者WebSphere,如果你在一个叶面内lookup的连接不关闭,那么等这个叶面的response访回后,容器会自动监视没有归还的连接,如果有的话,会跑出异常来警告你connection leak,然后自动关闭,你可能没注意看控制台的stack trace.
niunj 2005-05-26
  • 打赏
  • 举报
回复
“如果我的手下没有写这样的代码,我立马让他重写”

好派头 有个性 我喜欢 up
ChDw 2005-05-13
  • 打赏
  • 举报
回复
那我只能说你的架构师乱说

在J2EE的服务器当中,如果你通过DataSource.getConnection得到的conn是一个经过包装后的java.sql.Connection,
conn.close()所做的事情并不是真正的关闭关闭数据库连接,它仅仅将连接放回到连接池当中。

所以说conn.close()一般来说就是和断开数据库连接,但是在使用连接池的时候,这个很可能是两码事!!!


但是我认为你根本不需要关心它是不是一回事情,你都必须手工关闭rs, pstmt

如果我的手下没有写这样的代码,我立马让他重写
sinan 2005-05-13
  • 打赏
  • 举报
回复
关注,挺一个
100geOK 2005-05-13
  • 打赏
  • 举报
回复
ChDw(米) ( )
你说没有被真正关闭,意思是与断开数据库连接与conn.close()是
两码事。刚才问了公司的架构师,他说是会说收的。不过他的意思
是conn.close()和断开数据库连接是一码事。可以再说说你的看法?
simon11111122222 2005-05-12
  • 打赏
  • 举报
回复
自己手动关闭
是一个好的习惯
su27007 2005-05-12
  • 打赏
  • 举报
回复
ChDw(米) 讲得对!
ChDw 2005-05-12
  • 打赏
  • 举报
回复
pstmt必须也显式关闭,如果一个conn是真正的被关闭,pstmt当然也会被关闭释放

但是在很多Web应用中,代码中不可避免的使用连接池,这个时候conn.close()根本没有真正关闭conn,它只是将这个conn放回连接池中,所以这个时候pstmt是没有被关闭的


所以我还是这个说法,必须在代码中显式关闭rs, pstmt。conn也必须显式释放
100geOK 2005-05-12
  • 打赏
  • 举报
回复
EchoEverything(小E)
你的意思是说只要con.close()以后,rs,stmt在数据库占用的资源会关闭?
后台不是我写的,而且已经是成形的东西,我昨天看了后台代码,只是感到奇怪。
服务器一直都没有出现什么异常,昨天也看了一些文章,好象是可以自动进行关闭
数据库资源。后台一直是关闭con和rs的,只是pstmt没关闭。是不是con关闭后,
其他资源也会关闭?
EchoEverything 2005-05-11
  • 打赏
  • 举报
回复
我不知道楼主的服务器webshare是怎么工作的,我一直使用的是Tomcat。

Tomcat在4.0.6后便可以配置连接池了,当连接池配置完毕后,con.close()连接关闭方法相应的就变成了连接回收方法,也就是说并不需要改变以往的编码书写习惯,这是其一。

在Tomcat4.1.8以后,Tomcat加强了连接池的配置功能,如延迟、等待、自动回收……,但是仍然需要书写con.close()方法,因为等待连接池自动回收不是一个好的习惯,另外,rs.close(),和stmt.close(),始终是需要你书写的,因为连接池并没有提供有关他们的回收方法。尽管con关闭后,相应的rs和stmt也就关闭了,但是这样会增加JVM的回收负担,导致效率下降。
007remember 2005-05-11
  • 打赏
  • 举报
回复
还是
自己手动关闭
这是好的习惯啦
MARS.nEIL 2005-05-11
  • 打赏
  • 举报
回复
同意楼上的.
ChDw 2005-05-11
  • 打赏
  • 举报
回复
我认为是不正确的做法,无论别人内部到底有没有正确的关闭statement resultset这些东西

你都必须在代码中显式的关闭,即使这个别人会帮你完成。这个是最最基本的代码书写规范!

81,092

社区成员

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

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