使用者在用完数据库连接后通常是直接调用连接的方法 close 来释放数据库资源,如果用我们前面提到的连接池的实现方法,那语句 conn.close() 将被某些特定的语句所替代。
综合上面提到的两个问题,我们来讨论一下如何解决这两个要命的问题。
通过对用户使用的描述,怎样可以接管 Connection.close 方法就成了我们这篇文章的主题。
首先,我们先定义一个数据库连接池参数的类,定义了数据库的 JDBC 驱动程序类名,连接的 URL 以及用户名口令等等一些信息,该类是用于初始化连接池的参数,具体定义如下:
其次是连接池的工厂类 ConnectionFactory,通过该类来将一个连接池对象与一个名称对应起来,使用者通过该名称就可以获取指定的连接池对象,具体代码如下:
ConnectionFactory 主要提供了用户将将连接池绑定到一个具体的名称上以及取消绑定的操作。使用者只需要关心这两个类即可使用数据库连接池的功能。下面我们给出一段如何使用连接池的代码:
从使用者的示例代码就可以看出,我们已经解决了常规连接池产生的两个问题。但是我们最最关心的是如何解决接管 close 方法的办法。接管工作主要在 ConnectionFactory 中的两句代码:
source = new DataSourceImpl(param); source.initConnection(); |
终于到了核心所在,我们先来看看 _Connection 是如何实现的,然后再介绍是客户端调用 Connection.close 方法时走的是怎样一个流程,为什么并没有真正的关闭连接。
以上文字只是描述了接口方法的接管,具体一个实用的连接池模块还需要对空闲连接的监控并及时释放连接,详细的代码请参照附件
原文:http://www.ibm.com/developerworks/cn/java/l-connpoolproxy/