JDBC连接池概念与理解

为什么要使用数据库连接池:

JDBC作为一种数据库访问技术,具有简单易用的优点。

但是在使用JDBC进行与数据库有关的应用开发中,数据库连接的管理是一个难点。

很多时候,连接的混乱管理所造成的系统资源开销过大成为制约大型企业级应用效率的瓶颈。因为每一次WEB请求都要建立一次数据库连接,建立连接是一个耗费资源的活动,每次都得花费0.05-1s的时间,而且系统还要分配内存资源。这个时间对于一次或几次数据库操作,或许感觉不出系统有多大的开销,可是对于现在web应用,尤其是大型的电子商务网站, 同时有几百人甚至几千人在线是很正常的事情。(使用连接池和不使用连接池在效率上的差别,大约是5-10倍。


数据库连接池的基本原理:

在整个后台服务的处理过程中,建立数据库连接是一个费时的过程,所以数据库连接池的核心就是连接复用,减少连接的建立次数。

数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。于现在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从缓冲池中取出一个使用完毕以后再放回去即可。

开发人员通过设定连接池最大连接数防止系统无止尽地创建数据库连接。更为重要的是,开发人员可以通过连接池的管理机制监视数据库的连接数量及使用情况,从而为系统开发、测试及性能调整提供依据。


连接池的分配与释放

每当用户请求一个连接时,系统首先检查连接池内有没有空闲连接。如果有就把建立时间最长的那个连接分配给他;如果没有则检查当前所开的连接池**是否达到连接池所允许的最大连接数。如果没有达到,就新建一个连接;如果已经达到,就等待一定的时间。如果在等待的时间内有连接被释放出来,就可以把这个连接分配给等待的用户;如果等待时间超过预定时间,则返回空值;

简单画一个流程图(markdown有点意思hhh):

Created with Raphaël 2.2.0 连接请求 有没有空闲连接? 分配建立时间最长的连接 是否达到连接池所允许的最大连接数 等待是否有释放的连接 分配给等待的用户 NULL 新建一个连接分配用户 yes no yes no yes no

系统对已经分配出去正在使用的连接只做计数,当使用完后再返还给空闲池。对于空闲连接的状态,可开辟专门的线程定时检测,这样会花费一定的系统开销,但可以保证较快的响应速度;也可采取不开辟专门线程,只是在分配前检测的方法。


数据库连接池的实现分析:

  1. 并发问题
    为了使连接管理服务具有更大的通用性,必须考虑多线程环境,即并发问题。这个问题相对比较好解决,我们使用synchronized关键字即可确保线程的同步。示例代码: Public synchronized Connection getConnection()

  2. 多数据库服务器和多用户
    对于大型的企业级应用,常常需要同时连接不同的数据库。如何连接不同的数据库呢?可以采用的策略是:设计一个符合单例模式的连接池管理类,在连接池管理类的实例被创建时读取一个资源文件,其中资源文件中存放着多个数据库的连接信息。根据资源文件提供的信息,创建多个连接池类的实例,每一个实例都是一个特定数据库的连接池。连接池管理类实例为每个连接池实例取一个名字,通过不同的名字来管理不同的连接池。

  3. 事务处理
    可以通过设置Connection的AutoCommit属性为false, 然后显示地调用commit或rollback来实现。但要高效地进行Connection复用,就必须提供相应的事务支持机制。可采用每一个事务独占一个连接来实现,这种方法可以大大降低事务管理的复杂性。

  4. 连接池的分配和释放
    每当用户请求一个连接时,系统首先检查空闲池内有没有空闲连接。如果有就把建立时间最长的那个连接分配给他;如果没有则检查当前所开的连接池是否达到连接池所允许的最大连接数。如果没有达到,就新建一个连接;如果已经达到,就等待一定的时间。如果在等待的时间内有连接被释放出来,就可以把这个连接分配给等待的用户;如果等待时间超过预定时间,则返回空值;系统对已经分配出去正在使用的连接只做计数,当时用完后再返回给空闲池;对于空闲连接的状态,可开辟专门的线程定时检测,这样会花费一定的系统开销,但可以保证较快的相应速度;也可采取不开辟专门线程,只是在分配前检测的方法。

  5. 连接池的配置和维护
    连接池中到底应该放置多少连接,才能使系统的性能最佳?系统可采取设置最小连接数和最大连接数来控制连接池中的连接。最小连接数是系统启动时连接池所创建的连接数,最大连接数是连接池中允许连接的最大数目。


你可能感兴趣的:(JDBC)