连接池技术的连接池的建立
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了连接池技术的连接池的建立相关的知识,希望对你有一定的参考价值。
参考技术A应用程序中建立的连接池其实是一个静态的。所谓静态连接池是指连接池中的连接在系统初始化时就已分配好,且不能随意关闭连接。Java中提供了很多容器类可以方便的构建连接池,如:Vector、Stack、Servlet、Bean等,通过读取连接属性文件Connections.properties与数据库实例建立连接。在系统初始化时,根据相应的配置创建连接并放置在连接池中,以便需要使用时能从连接池中获取,这样就可以避免连接随意的建立、关闭造成的开销。 连接池管理策略是连接池机制的核心。当连接池建立后,如何对连接池中的连接进行管理,解决好连接池内连接的分配和释放,对系统的性能有很大的影响。连接的合理分配、释放可提高连接的复用,降低了系统建立新连接的开销,同时也加速了用户的访问速度。下面介绍连接池中连接的分配、释放策略。
连接池的分配、释放策略对于有效复用连接非常重要,我们采用的方法是一个很有名的设计模式:Reference Counting(引用记数)。该模式在复用资源方面应用的非常广泛,把该方法运用到对于连接的分配释放上,为每一个数据库连接,保留一个引用记数,用来记录该连接的使用者的个数。具体的实现方法是:
当客户请求数据库连接时,首先查看连接池中是否有空闲连接(指当前没有分配出去的连接)。如果存在空闲连接,则把连接分配给客户并作相应处理(即标记该连接为正在使用,引用计数加1)。如果没有空闲连接,则查看当前所开的连接数是不是已经达到maxConn(最大连接数),如果没达到就重新创建一个连接给请求的客户;如果达到就按设定的maxWaitTime(最大等待时间)进行等待,如果等待maxWaitTime后仍没有空闲连接,就抛出无空闲连接的异常给用户。
当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过就删除该连接,并判断当前连接池内总的连接数是否小于minConn(最小连接数),若小于就将连接池充满;如果没超过就将该连接标记为开放状态,可供再次复用。可以看出正是这套策略保证了数据库连接的有效复用,避免频繁地建立、释放连接所带来的系统资源开销。 前面讨论的是关于使用数据库连接进行普通的数据库访问。对于事务处理,情况就变得比较复杂。因为事务本身要求原则性的保证,此时就要求对于数据库的操作符合All-or-Nothing原则,即要么全部完成,要么什么都不做。如果简单的采用上述的连接复用的策略,就会发生问题,因为没有办法控制属于同一个事务的多个数据库操作方法的动作,可能这些数据库操作是在多个连接上进行的,并且这些连接可能被其他非事务方法复用。Connection本身具有提供了对于事务的支持,可以通过设置Connection的AutoCommit属性为false,显式的调用 commit或rollback方法来实现。但是要安全、高效的进行连接复用,就必须提供相应的事务支持机制。方法是:采用显式的事务支撑方法,每一个事务独占一个连接。这种方法可以大大降低对于事务处理的复杂性,并且又不会妨碍连接的复用。
连接管理服务提供了显式的事务开始、结束(commit或rollback)声明,以及一个事务注册表,用于登记事务发起者和事务使用的连接的对应关系,通过该表,使用事务的部分和连接管理部分就隔离开,因为该表是在运行时根据实际的调用情况动态生成的。事务使用的连接在该事务运行中不能被复用。在实现中,用户标识是通过使用者所在的线程来标识的。后面的所有对于数据库的访问都是通过查找该注册表,使用已经分配的连接来完成的。当事务结束时,从注册表中删除相应表项。 在实际应用中,应用程序常常需要访问多个不同的数据库。如何通过同一个连接池访问不同的数据库,是应用程序需要解决的一个核心问题。下面介绍一种解决的途径:
首先,定义一个数据库连接池参数的类,定义了数据库的JDBC驱动程序类名,连接的URL以及用户名口令等等一些信息,该类是用于初始化连接池的参数:
public class ConnectionParam implements Serializable//各初始化参数的定义
其次是连接池的工厂类ConnectionFactory,通过该类将一个连接池对象与一个名称对应起来,使用者通过该名称就可以获取指定的连接池对象,实现的主要代码如下:
public class ConnectionFactorystatic Hashtable connectionPools = //用来保存数据源名和连接池对象的关系public static DataSource lookup(String dataSourceName) throws
NameNotFoundException//查找名字为dataSourceName的数据源public static DataSource bind(Stringname, ConnectionParam param)
throws Exception=/将名字name与使用param初始化的连接池对象绑定
public static void unbind(String name) throws NameNotFound
Exception
//将与名字name绑定的连接池对象删除
数据库连接池的工作原理以及这项技术的产生
为什么要有这项技术?
数据库连接是一种非常珍贵而且有限的资源,尤其是在多用户的网络上,对数据库的管理好坏直接影响整个系统的性能
一、建立一个数据库连接是一项非常耗时的操作,在页面应用中如果每次用户都需要创建一次数据库连接,那么响应的时间就会非常长,会影响用户体验
二、数据库连接数是有限的,如果管理不好用户经常与数据库建立连接却忘记了释放,那么运行时间久了,数据库连接资源将会被耗尽,当再有新的用户操作时将会进行等待,直到资源被释放,这对系统的可用性造成了影响。因此管理好数据库连接资源非常重要,尤其是web应用系统。
数据库连接池的工作原理
数据库连接池是负责分配,管理并释放数据库连接,它允许重复只用一个现有数据库连接,而不是新建一个数据库连接,同时它还负责释放时间超过最大空闲时间的数据库连接,避免因为没有数据库连接而造成的遗漏。
在j2ee中,服务器启动时会创建一定数量的池连接,并维持不少于这个数量的连接,当用户需要数据库连接时首先使用池连接(空闲的池连接),而不是创建一个新的数据库连接,并标记为繁忙状态,当用户使用完这个数据库连接后会释放当前连接,并标记为空间连接。如果使用时没有空闲连接,服务器会根据参数的配置去创建新的数据库连接,采用这种方法会大大提高系统的响应时间,提高运行效率。另一方面提高操作性能,数据库连接是会释放当前空闲时间超过最大空闲时间的数据库连接,避免发生因没有释放数据库连接的遗漏。
以上是关于连接池技术的连接池的建立的主要内容,如果未能解决你的问题,请参考以下文章