概念
连接池是创建和管理一个连接的缓冲池技术,连接池准备好后会被任何需要它们的线程使用。这种把连接“汇集”起来的技术基于这样的事实:对于大多数应用程序,当它们正在处理时通常需要好几毫秒才能完成。
原理
连接池技术的核心思想是:连接复用,通过建立一个数据库连接池以及一套连接使用、分配、管理策略,使得改连接池中的连接可以得到高效、安全的复用,避免了数据库连接频繁建立、关闭的开销。另外,由于对JDBC中原始连接进行了封装,从而方便了数据库应用。对于连接的使用(特别是对于事务处理),提高了开发效率,也正因为这个封装层的存在,隔离了应用本身的处理逻辑和具体数据的访问逻辑,是应用本身的复用成为了可能。
组成部分
连接池主要由三部分组成:连接池的建立、连接池中连接的使用管理、连接池的关闭。
连接池的建立
应用程序建立的连接池实际上是一个静态的连接池。所谓静态的连接池是指连接池中的连接在系统初始化时就已经分配好,且不能随意地关闭连接。Java中提供了很多容器类,可以方便地构建连接池,如Vector、Stack、Servlet、Bean等,通过读取数据库连接属性文件Connection.property与数据库实例建立连接。在系统初始化时,根据相应的配置创建连接并放置在连接池中,以便需要使用时能从连接池中获取,这样就避免了连接随意的建立、关闭造成的开销。
连接池中连接的使用管理
连接池管理策略是连接池机制的核心。连接池的分配、释放策略对于有效复用、连接非常重要,我们采用的方法是一个很有名的设计模式:Reference Counting(引用计数)。该模式在复用资源方面应用非常广泛,把该方法运用到对于连接的分配释放上,为每一个数据库连接保留一个应用记数,用来记录该连接的使用者的个数。具体实现方法如下:
客户请求数据库连接时,首先查看连接池中是否有空闲连接(指当前没有分配出去的连接)。如果存在空闲连接,则把连接分配给客户并作相应处理(即标记改连接为正在使用,引用计数加1)。如果没有空闲连接,则查看当前所开的连接数是不是已经到了maxCon(最大连接数),如果没有达到醉倒就重新创建一个连接给请求的客户;如果达到了就按设定的maxWaitTime(最大等待时间)进行等待,如果等待maxWaitTime后人没有空闲连接,就抛出无空闲连接的异常给用户。
客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过就删除该连接,并判断当前连接池内总的连接数是否小于minConn(最小连接数),若小于就将连接池充满;如果没有超过就将该连接标记为开放状态,可供再次复用。可以看出正事这套策略保证了数据库连接的有效复用,避免频繁地建立、释放连接所带来的系统资源开销。
连接池的关闭
当应用程序退出时,应关闭连接池,此时应把在连接池建立时向数据库申请的连接对象统一归还给数据库(即关闭所用数据库连接),这与连接池的建立正好是个相反的过程。