论坛首页 Java企业应用论坛

如何在关闭数据库链接时,自动关闭由该链接创建的所有Statement

浏览 8953 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-04-21  
Lucas Lee 写道
既然这样的话,我也觉得包装Connection,然后delegate到实际的Connection上,除了在prepareStatement,createStatement等方法上做一些处理,将Statement对象记录下来;等Connection.close()时,调用所有Statement.close()。


可能是我没说明白

我知道这种方式可以 也知道是最好的实现方式

但我的核心问题就是
"在prepareStatement,createStatement等方法上做一些处理,将Statement对象记录下来"
那么怎么记录? 你不能记录当前链接打开的所有的的Statement,因为这样是不安全的吧 因为使用了池,会出现关闭不想关闭的Statement的情况.
所以我真正想问的是
" 使用 ThreadLocal对象记录 当前conn在当前线程内打开的所有的Statement.
这样的思路可以不 "??

而不是该使用什么样的模式来实现这个功能

0 请登录后投票
   发表时间:2007-04-21  
fins 写道

所以我真正想问的是
" 使用 ThreadLocal对象记录 当前conn在当前线程内打开的所有的Statement.
这样的思路可以不 "??

我觉得这样没有什么问题。
但我不觉得应该用ThreadLocal来记录,一个Connection应该只给一个线程使用(在连接池情况下,也是被close()之后才可以分配给其他线程的。),所以用一般的容器类存放所有此连接上打开的Statement就可以了,在connection.close()时,调用容器中所有的Statement.close(),并清空容器。
0 请登录后投票
   发表时间:2007-04-22  
谢谢 你解开了我一大疑问啊

我对池的一些知识确实很匮乏 谢谢指点

"在连接池情况下,也是被close()之后才可以分配给其他线程的"
这句话正是我想知道的 谢谢
0 请登录后投票
   发表时间:2007-04-26  
在连接池情况下,也是被close()之后才可以分配给其他线程的

确定?
0 请登录后投票
   发表时间:2007-07-12  
建议不要这样,这样的话维护较为困难,我的方法是代理连接池,spring也可采用第三方数据源,写个connection代理,new YouCnnection(Connection delegate).这样对于系统是透明的,默默地把资源回收了

代理里面想解决关闭statement的事,不用说大家也知道怎么做了吧。

0 请登录后投票
   发表时间:2007-07-12  

      楼上才是正解,原有代码不做任何修改;
      
      出现这种问题,spring完全没有用好。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics