数据库链接池的工做原理

对于共享资源,有一个很著名的设计模式:资源池(resource pool)。该模式正是为解决资源频繁分配、释放所形成的问题。数据库链接池的基本思想就是为数据库链接创建一个“缓冲池”。预先在缓冲池中放入必定数量的链接,当须要创建数据库链接时,只须要从缓冲池中取出一个了,使用完毕后再放回去。咱们能够经过设定链接池最大数来防止系统无尽的与数据库链接。更为重要的是咱们能够经过链接池的管理机制监视数据库链接使用数量,使用状况,为系统开发,测试以及性能调整提供依据。java

链接池的相关问题分析:sql

一、并发问题。数据库

  为了使链接管理服务具备最大的通用性,必须考虑多线程环境,并发问题。这个问题相对比较好解决,由于各个语言自身提供了并发管理的支持,好比java c#等,使用synchronized(java)  lock(c#)等关键字确保线程同步。编程

二、事务管理。c#

  咱们知道,事务具备原子性,此时要求对数据库操做符合“ALL-ALL-NOTHING”原则,即对于一组sql语句要么全作,要么全不作。咱们知道当两个线程共用一个链接connection对象时,并且各自都有本身的事务要处理时,对于链接池是一个很头疼的问题,由于即便connection类提供了相应的事务支持,但是咱们仍然不能肯定那个数据库操做对应那个事务。知识因为咱们的两个线程都在进行事务操做。为此咱们可使用每个事物独占一个链接来实现,虽然这种方法有点浪费链接池资源可是能够大大下降事务管理的复杂性。设计模式

三、链接池的分配与释放安全

  链接池的分配与释放,对系统的性能有很大的影响。合理的分配与释放,能够提升链接的复用度,从而下降创建新链接的开销,同时还能够加快用户的访问速度。   对于链接的管理可以使用一个List。即把已经建立的链接都放入List中去统一管理。每当用户请求一个链接时,系统检查这个List中有没有能够分配的链接。若是有就把那个最合适的链接分配给他(如何能找到最合适的链接文章将在关键议题中指出);若是没有就抛出一个异常给用户,List中链接是否能够被分配由一个线程来专门管理捎后我会介绍这个线程的具体实现。多线程

四、链接池的配置与维护并发

  链接池中到底应该放置多少链接,才能使系统的性能最佳?系统可采起设置最小链接数(minConnection)和最大链接数(maxConnection)等参数来控制链接池中的链接。比方说,最小链接数是系统启动时链接池所建立的链接数。若是建立过多,则系统启动就慢,但建立后系统的响应速度会很快;若是建立过少,则系统启动的很快,响应起来却慢。这样,能够在开发时,设置较小的最小链接数,开发起来会快,而在系统实际使用时设置较大的,由于这样对访问客户来讲速度会快些。最大链接数是链接池中容许链接的最大数目,具体设置多少,要看系统的访问量,可经过软件需求上获得。   如何确保链接池中的最小链接数呢?有动态和静态两种策略。动态即每隔必定时间就对链接池进行检测,若是发现链接数量小于最小链接数,则补充相应数量的新链接,以保证链接池的正常运转。静态是发现空闲链接不够时再去检查。性能

 

引用记数

  在分配、释放策略对于有效复用链接很是重要,咱们采用的方法也是采用了一个颇有名的设计模式:reference counting(引用记数)。该模式在复用资源方面使用很是普遍,咱们把该方法运用到对于链接分配释放上。每个数据库链接,保留一个引用记数,用来记录该连接的使用者的个数。具体实现上,咱们对connection类进行了进一步包装来实现引用记数。被包装的connection类咱们提供2个方法来实现引用记数的操做,一个是repeat(被分配出去)一个是remove(被释放回来);而后利用repeatnow属性来肯定当前引用多少,具体是哪一个用户引用了该链接,将在链接池中登记;最后提供isRepeat属性来肯定该链接是否可使用引用记数技术。一旦一个链接被分配出去,那么就会对该链接的申请者进行登记,而且增长引用记数,当被释放回来时就删除他登记的信息,同时减小一次引用记数。这样作的一个很大的好处是,使得咱们能够高效的使用链接,由于一旦全部链接都被分配出去,咱们就能够根据相应的策略从使用池中挑出一个正在使用的链接来复用,而不是随便拿出一个链接去复用。

 

 

        链接池用于建立和管理数据库链接的缓冲技术,缓冲池中的链接能够被任何须要他们的线程使用。当一个线程须要使用JDBC对一个数据库操做时,将从池中请求一个链接。当这个连接使用完毕后,将返回链接池中,等待为其余的线程服务。

  链接池的主要优势:

1)减小链接的建立时间,链接池中的链接是已准备好的,能够重复使用的,获取后能够直接访问数据库,所以减小了链接建立的次数和时间。

2)简化的编程模式。当使用链接池时,每个单独的线程可以像建立本身的JDBC链接同样操做,容许用户直接使用 JDBC编程技术。

3)控制资源的使用。若是不使用链接池,每次访问数据库都须要建立一个链接,这样系统的稳定性受系统的链接需求影响很大,很容易产生资源浪费和高负载异常。链接池可以使性能最大化,将资源利用控制在必定的水平之下。链接池能控制池中的连接数量,加强了系统在大量用户应用时的稳定性。

链接池的工做原理:

链接池的核心思想是链接的复用,经过创建一个数据库链接池以及一套链接使用、分配和管理策略,使得该链接池中的链接能够获得高效,安全的复用,避免了数据库链接频繁创建和关闭的开销。

链接池的工做原理主要由三部分组成,分别为链接池的创建,链接池中链接的使用管理,链接池的关闭。

第1、链接池的创建。通常在系统初始化时,链接池会根据系统配置创建,并在池中创建几个链接对象,以便使用时能从链接池中获取,链接池中的链接不能随意建立和关闭,这样避免了链接随意创建和关闭形成的系统开销。java中提供了不少容器类,能够方便的构建链接池,例如Vector,stack等。

第2、链接池的管理。链接池管理策略是链接池机制的核心,链接池内链接的分配和释放对系统的性能有很大的影响。其策略是:

当客户请求数据库链接时,首先查看链接池中是否有空闲链接,若是存在空闲链接,则将链接分配给客户使用;若是没有控线链接,则查看当前所开的链接数是否已经达到最大链接数,例如若是没有达到就从新建立一个请求的客户;若是达到,就按设定的最大等待时间进行等待,若是超出最大等待时间,则抛出异常给客户。

当客户释放数据库链接时,先判断该链接的引用次数是否超过了规定值,若是超过了就从链接池中删除该链接,不然就保留为其余客户服务。该策略保证了数据库链接的有效复用,避免了频繁创建释放链接所带来的系统资源的开销。

第3、链接池的关闭。当应用程序退出时,关闭链接池中全部的连接,释放链接池相关资源,该过程正好与建立相反。

相关文章
相关标签/搜索