当前位置:天才代写 > tutorial > 数据库教程 > 数据库连接池相关问题分析

数据库连接池相关问题分析

2018-05-18 08:00 星期五 所属: 数据库教程 浏览:871

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

资源池

  连接池的相关问题分析:

  1、并发问题

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

  2、事务管理

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

  3、连接池的分配与释放

  连接池的分配与释放,对系统的性能有很大的影响。合理的分配与释放,可以提高连接的复用度,从而降低建立新连接的开销,同时还可以加快用户的访问速度。

  对于连接的管理可使用一个List。即把已经创建的连接都放入List中去统一管理。每当用户请求一个连接时,系统检查这个List中有没有可以分配的连接。如果有就把那个最合适的连接分配给他(如何能找到最合适的连接文章将在关键议题中指出);如果没有就抛出一个异常给用户,List中连接是否可以被分配由一个线程来专门管理捎后我会介绍这个线程的具体实现。

  4、连接池的配置与维护

  连接池中到底应该放置多少连接,才能使系统的性能最佳?系统可采取设置最小连接数(minConnection)和最大连接数(maxConnection)等参数来控制连接池中的连接。比方说,最小连接数是系统启动时连接池所创建的连接数。如果创建过多,则系统启动就慢,但创建后系统的响应速度会很快;如果创建过少,则系统启动的很快,响应起来却慢。这样,可以在开发时,设置较小的最小连接数,开发起来会快,而在系统实际使用时设置较大的,因为这样对访问客户来说速度会快些。最大连接数是连接池中允许连接的最大数目,具体设置多少,要看系统的访问量,可通过软件需求上得到。

  如何确保连接池中的最小连接数呢?有动态和静态两种策略。动态即每隔一定时间就对连接池进行检测,如果发现连接数量小于最小连接数,则补充相应数量的新连接,以保证连接池的正常运转。静态是发现空闲连接不够时再去检查。

  5、引用记数

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

#p#分页标题#e#

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

  连接池的主要优点:

  1)减少连接的创建时间,连接池中的连接是已准备好的,可以重复使用的,获取后可以直接访问数据库,因此减少了连接创建的次数和时间。

  2)简化的编程模式。当使用连接池时,每一个单独的线程能够像创建自己的JDBC连接一样操作,允许用户直接使用JDBC编程技术。

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

  连接池的工作原理:

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

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

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

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

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

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

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

  看完数据库连接池的相关问题分析,那么下面来看一下几种常用的数据库连接池:

  一.DBCP(DatabaseConnectionPool)

  是一个依赖Jakartacommons-pool对象池机制的数据库连接池,Tomcat的数据源使用的就是DBCP。目前DBCP有两个版本分别是1.3和1.4。1.3版本对应的是JDk1.4-1.5和JDBC3,而1.4版本对应JDK1.6和JDBC4。因此在选择版本的时候要看看你用的是什么JDK版本了,功能上倒是没有什么区别。

  二.C3P0

  是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection和Statement池的DataSources对象。

  三.Proxool

  是一个JavaSQLDriver驱动程序,提供了对你选择的其它类型的驱动程序的连接池封装。可以非常简单的移植到现存的代码中。完全可配置。快速,成熟,健壮。可以透明地为你现存的JDBC驱动程序增加连接池功能

  四.BoneCP

  是一个开源的快速的JDBC连接池。BoneCP很小,只有四十几K(运行时需要log4j和GoogleCollections的支持,这二者加起来就不小了),而相比之下C3P0要六百多K。另外个人觉得BoneCP有个缺点是,JDBC驱动的加载是在连接池之外的,这样在一些应用服务器的配置上就不够灵活。当然,体积小并不是BoneCP优秀的原因,BoneCP到底有什么突出的地方呢,请看看性能测试报告。

  通过对三种数据库连接池的性能测试发现,proxool和c3p0能够更好的支持高并发,但是在稳定性方面略逊于dpcp。

四.BoneCP    是一个开源的快速的JDBC连接池。BoneCP很小,只有四十几K(运行时需要log4j和GoogleCollections的支持,这二者加起来就不小了),而相比之下C3P0要六百多K。另外个人觉得BoneCP有个缺点是,JDBC驱动的加载是在连接池之外的,这样在一些应用服务器的配置上就不够灵活。当然,体积小并不是BoneCP优秀的原因,BoneCP到底有什么突出的地方呢,请看看性能测试报告。    通过对三种数据库连接池的性能测试发现,proxool和c3p0能够更好的支持高并发,但是在稳定性方面略逊于dpcp。

  小编结语:

  更多内容尽在课课家教育!

 

    关键字:

天才代写-代写联系方式