数据库连接池

来源:互联网 发布:女生滴风油精知乎 编辑:程序博客网 时间:2024/06/03 17:47

传统方式的缺点:频繁的建立、关闭数据库,会极大的降低系统的性能,增大系统的开销;还必须管理数据库的每一个连接,以确保他们能正确的关闭,如果出现程序异常而导致某些连接未能关闭,将引起数据库系统中的内存泄漏;


连接池技术

1.连接池原理

连接池技术的核心思想是:连接复用,通过建立一个数据库连接池以及一套连接使用、分配、管理策略,使得该连接池中的连接可以得到高效、安全的复用,避免了数据库连接频繁建立、关闭的开销。另外,由于对JDBC原始连接进行了封装,从而方便了数据库应用对于连接的使用。

2.连接池的建立

应用程序中建立的连接池其实是一个静态的。所谓静态连接池是指连接池中的连接在系统初始化时就已分配好,且不能随意关闭连接。Java中提供了很多容器 类可以方便的构建连接池,如:Vector、Stack、Servlet、Bean等,通过读取连接属性文件 Connections.properties与数据库实例建立连接。在系统初始化时,根据相应的配置创建连接并放置在连接池中,以便需要使用时能从连接 池中获取,这样就可以避免连接随意的建立、关闭造成的开销。

连接池的管理

连接池管理策略是连接池机制的核心。当连接池建立后,如何对连接池中的连接进行管理,解决好连接池内连接的分配连接分配和释放,对系统的性能有很大的影响。连接的合理分配、释放可提高连接的复用,降低了系统建立新连接的开销,同时也加速了用户的访问速度。

连接池的分配、释放策略对于有效复用连接非常重要,我们采用的方法是一个很有名的设计模式:

Reference Counting(引用计数)。该模式在复用资源方面应用的非常广泛,把该方法用到对于连接的分配连接上,为每个数据库连接,保留一个引用计数。用来记录该连接的使用者的个数。具体实现方法是:

当客户端请求数据库连接是,首先查看连接池中是否有空闲连接(指当前没有分配出去的连接)。如果存在空闲连接,则把连接分配给客户并作相应的处理(即标记该连接为正在使用,引用计数+1)。如果没有空闲连接,则查看当前所有连接数是不是已经达到maxCount(最大连接数),如果没达到就重新创建一个连接给请求的客户,如果达到就按设定的maxWaitTime(最大等待时间)进行等待,如果等待maxWaitTime后仍没有空闲连接,就抛出无空闲连接的异常给用户。

当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过就删除该连接,并判断当前连接池内总的连接数时候小于minCount(最小连接数),若小于就将连接池充满;如果没超过就将该连接标记为开放状态,可供再次复用。可以看出正式这套策略保证了数据库连接的有效复用,避免了频繁的建立、释放连接带来系统资源开销。