日期:2014-05-19  浏览次数:20706 次

请教一个连接池释放的问题
对于Java连接池,我一直有一个疑问一直没有得到解决,请大家帮忙解惑:
1. Java里自己写的连接池,如果要释放是否要这样显式执行?
if(con!=null&!con.isClosed())
{
 con.close();
 con=null;
}
2. 如果是的话,是不是表示这个Con已经被关闭了?下次使用时还得重新建立?那么这个池和每次使用时建立Con有什么区别?
3. 如果不是的话,请指导如何正确释放连接Con?
4. 我尝试con.close();connectionMan.freeConnection(connName, conn);后(未设置con=null),刷新时提示connection已关闭的错误
------------
 public synchronized void freeConnection(Connection con) 
 {
  this.freeConnections.add(con);//添加到空閒連接的末尾
  this.inUsed--;
 }
------------



------解决方案--------------------
1. Java里自己写的连接池,如果要释放是否要这样显式执行?
我的理解之所以叫连接池,一定不是每次用完就关闭。
而是提供函数让用的人用好了,告诉连接池,然后连接池可以把这个链接分配给其他人。
当然系统或程序时结束是需要正式关闭。 还能够处理无效连接(原来登记为可用的连接,由于某种原因不再可用,如超时,通讯问题)

2. 1的回答是不是。

3. freeConnections不知道你用的是什么?这个list一定不能是ArrayList因为他线程不安全。
用Vector记吧。 
 public synchronized void freeConnection(Connection con) 
 {
this.freeConnections.add(con);//添加到空閒連接的末尾
this.inUsed--;
 }
这样挺好呀。。。 但是之前不能把con给close了。
你可以适当检查下con的状态,比如isClosed,没有关闭再add进去。

4.调用close,con就真的关闭了。 =null只是能让jvm更早地回收connection相关的其他资源。

------解决方案--------------------
连接池重写了 Connection.close() 函数,当你调用 close() 是,就相当于通知连接池:
“该连接我绝对不再使用了,请你回收吧。”
所以实际上Connection并没有被关闭,这样最大的好处就是,无论是否有使用连接池,对应用开发者是透明的,否则变成应用开发者要根据是否使用了连接池来选择是调用close()还是release(),那就很扯淡了。


道理就是上面这个道理了,如果你自己写连接池,也要遵循这个做法,否则是非常不合理的。


最后,非常不建议自己开发连接池,大量成熟的连接池组件,就不要重复发明轮子了。
------解决方案--------------------
同意楼上的,如果作为练习了解。可以自己写连接池来玩玩。

如果实际产品或项目开发建议使用现成的库。
比如:
http://developer.51cto.com/art/201006/207768.htm