日期:2014-05-17  浏览次数:20968 次

tomcat连接池如何关闭连接,将资源返回给连接池?
tomcat连接池如何关闭连接是使用conn.close()还是conn=null.两者有什么区别?

------解决方案--------------------
conn.close()
区别是conn=null不会返回连接池,可能造成资源无法回收。
------解决方案--------------------
编程的好习惯是先coon.close(),再conn=null,
coon.close()是关闭连接池,conn=null是蛇者conn为空,使下次再调用的时候不能连接。
------解决方案--------------------
用 conn.close(),所有的连接池实现都会采用动态代理或者装饰器模式把原本 Connection 的 close 方法改写,
改成并不是真正意义上地关闭与数据库的物理连接,而是将其还到连接池中去便于重用。

conn = null; 只是将局部变量置为了 null,并没有将实际的连接置为 null 或者还到连接池中去。
------解决方案--------------------
conn=null;就是表示一个引用,但没有指向任何对象,等待垃圾回收时进行对象资源回收!
conn.close();表示关闭连接。

如果
conn=null;//在前
conn.close();//在后
则会报空指针异常,反之不会有异常。。。。


个人观点,仅供参考。。。。。
------解决方案--------------------
探讨
用 conn.close(),所有的连接池实现都会采用动态代理或者装饰器模式把原本 Connection 的 close 方法改写,
改成并不是真正意义上地关闭与数据库的物理连接,而是将其还到连接池中去便于重用。

conn = null; 只是将局部变量置为了 null,并没有将实际的连接置为 null 或者还到连接池中去。

------解决方案--------------------
实际经验:

慎用conn.close()!
在实际工作中我们发现,如果使用tomcat JNDI并设置为容器管理连接池,则在调用conn.close()方法是会报非法访问异常,即你的项目没有权限去关闭tomcat帮你创建的连接对象,并不象5楼同学所说的情况(在tomcat6.0.18的开发版和服务器版,JDK版本1.5和1.6下均测试过,情况相同)。

个人使用经验和建议:由于权限问题,我们不可能关闭连接对象,也不应该去关闭连接对象,因为由tomcat创建的连接池并非仅只提供给单个项目使用,而是提供给所有处于tomcat容器下的项目使用,如果我们的项目将连接对象关闭了,则将影响其他项目的数据库连接池。

既然你已经将连接对象交由容器进行管理,那就不应该再过多关注,所以,个人建议,如果你使用了JNDI,那么要么写conn=null,要么不关闭。

谢谢。