数据库连接并不是池管理方式的唯一资源。对于那些初始化要付出昂贵代价的资源(例如,套接字和线程)来说,池管理方式可以获得显著的性能好处。因为用池管理资源(而不是数据库连接)有很多好处,所以,这里讨论的池连接是用一个基类实现的,它可以集中控制任何类型的对象以及数据库连接类的扩展。
GetResource通过调用getFirstAvailableResource从可用资源表中获取资源。如果资源可用,getFirstAvailableResource将用abstract isResourceValid方法检查资源的有效性。资源是否有效取决于资源的类型。例如,如果在某段时间内没有使用数据库连接,该连接就会过期。如果某个资源无效,就从可用资源表中清除掉它,getFirstAvailableResource就重新调用自己,搜索有效资源。如果没有可用资源,getResource就创建一个,将它加入到正在使用的资源列表中,并返回它。
将资源从正在使用的资源表中清除,然后将它添加到可用资源表中,recycleResource通过这种方式来使资源可用。这就是ResourcePool类的工作方式。下面是几个注意事项。首先,ResourcePool线程是安全的,因为它的所有类成员都是final,当迭代器对向量迭代时,如果修改该向量,将引发异常。其次,可用资源和正在使用的资源对ResourcePool子类可用。这就使得ResourcePool子类可以分配资源的初始缓存。第三,如果在创建资源时出错,则CreateResource和getResource会引发ResourceException异常。