`
marb
  • 浏览: 422437 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

dbcp连接池配置详解

 
阅读更多

以简单的工作过程说明各个参数的意义;

一:创建连接阶段:
服务器起动时,会建立initialSize个数据库连接,放入池中.

随着应用程序访问量的增加,需要的数据库连接也在增加. 
当需要的连接数大于池中的现有连接数(numActive)时,连接池再创建新的连接.具体一次创建多少,不知在哪设置(c3po连接池是通过acquireIncrement这个参数设置)
就这样一直创建一直增加,当达到 maxActive时不在创建. 新来的客户请求如果需要数据库连接,则处于等待状态.
等maxWait毫秒,在这时间内,如果得到别的已释放的连接,则用.没有得到别的已释放的连接则报错.注意:如果设置-1表示无限等待.

二:程序关闭连接,归还连接到连接池的阶段

当某段程序用完了一个连接,即程序释放了该连接,放回到了连接池中.此连接做为空闭连接计算(numIdle),numIdele在maxIdle,minIdle之间.

如果连接池中的连接,一直没有关闭,即程序一直没有关闭该连接,或者说一直没有将该连接放回池中,此时:两种情况

一: removeAbandoned=true,removeAbandonedTimeout=n秒(单位就是秒)

    此时如果该连接超过removeAbandonedTimeout设置的n秒,认为该连接已被泄漏,连接池进行清理,注意并没有放入池中,而是直接清理掉.

二:removeAbandoned=false, removeAbandonedTimeout不管有没有设置(即默认值为300秒),连接池不做任何处理.
   此类连接一直处于活动当中,但又不能用.
   以下三个参数针对这种情况进行设置.
   
        removeAbandoned true,false,是否清理removeAbandonedTimeout秒没有使用的活动连接,清理后并没有放回连接池
        removeAbandonedTimeout 活动连接的最大空闲时间
        logAbandoned true,false,连接池收回空闲的活动连接时是否打印消息

三:空闭连接处理阶段:即将空闭连接断开从连接池中清处掉.

   分两种情况:
   a: timeBetweenEvictionRunsMillis 的值大于零.
      则每timeBetweenEvictionRunsMillis毫秒检查一次连接池中空闲的连接,
     把空闲时间超过minEvictableIdleTimeMillis毫秒的连接断开,直到连接池中的连接数到minIdle为止.
      
      此时可设的参数有:
        参数名                                        默认值        描述
      timeBetweenEvictionRunsMillis     -1              在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位. 如果设置为非正数,则不运行空闲连接回收器线程
     minEvictableIdleTimeMillis     1000 * 60 * 30      连接在池中保持空闲而不被空闲连接回收器线程(如果有)回收的最小时间值,单位毫秒
     numTestsPerEvictionRun             3                  在每次空闲连接回收器线程(如果有)运行时检查的连接数量
        
                
    三个参数配合,可以持续更新连接池中的连接对象,当timeBetweenEvictionRunsMillis 大于0时,
    每过timeBetweenEvictionRunsMillis 时间,就会启动一个线程,校验连接池中闲置时间超过minEvictableIdleTimeMillis的连接 对象。
                
   b:  timeBetweenEvictionRunsMillis 的值小于零.
       难倒每次程序用完,都增加一个空闭连接,而不断开吗??那当maxActive设的大于maxIdle时,是不是空闭连接数有可能大于maxIdle.
       也许maxActive 的最大值必须等于maxIdle? 有点不解.
 
通过以上分析可以看到:

  程序从连接池取连接用,用完归还给连接池.连接池中连接少了池创建.多了则断开清处.
  
  取时检验:也就是在程序从连接池中取前: 可以通过 testOnBorrow =true, validationQuery=必须是一个SQL SELECT并且必须返回至少一行记录来进行对连接检验,检验失败,再取另一个.
           
  归还时检验:也就是程序释放连接,将连接归还给连接池中前进行检验.
             testOnReturn =true, validationQuery=必须是一个SQL SELECT并且必须返回至少一行记录
             
  空闭时检验:也就是连接池中的连接空闭下来时,进行检验.
             testWhileIdle=true   validationQuery=必须是一个SQL SELECT并且必须返回至少一行记录
==================================================================================
             
 总结:
对于数据库的连接池建议配制以下参数:
  initialSize,maxActive,maxIdle,minIdle,maxWait,removeAbandoned,removeAbandonedTimeout,(基本参数设置)
  testWhileIdle,validationQuery(连接池中连接检测参数设置)
  timeBetweenEvictionRunsMillis,minEvictableIdleTimeMillis,numTestsPerEvictionRun (空闭连接移去)
  
  一:基本参数设置
  其中:initialSize,与jvm的起动时间有关,想起动快就设小点。
  maxActive 与访问量有关
  maxIdle,minIdle 建议minIdle值稍小于maxIdle,但都小于maxActive
  maxWait   建议设值,不设不报错,但一直等待的状态也不好。
  
  建议设置以下两个值,当程序出现没有释放连接的情况时,能在有限的时间内断开,但也不会放回连接池。这样就会使连接池中的连接都是有效的。不会出现连接数有那么多,但可用的连接却很少。
  removeAbandoned=true,
  removeAbandonedTimeout=10单位即位秒 
  
  二:连接池中连接检测参数设置
  建议设置以下检验的相关参数:
  对空闭连接进行验证   
  testWhileIdle=true   validationQuery=必须是一个SQL SELECT并且必须返回至少一行记录

  再次也可以进行:
  对程序归还到连接池中的连接进行验证
  testOnReturn =true, validationQuery=必须是一个SQL SELECT并且必须返回至少一行记录
  
  甚至还可以在程序从数据库连接池中取连接时,进行验证:可能对情能有影响:(因为每次都是在需要查询数据前才验证)
  testOnBorrow =true, validationQuery=必须是一个SQL SELECT并且必须返回至少一行记录
  
  三:空闭连接移去
  
  最后:还可以对空闭连接进行定时检测。
              
  timeBetweenEvictionRunsMillis,minEvictableIdleTimeMillis,numTestsPerEvictionRun
    参数名                                         默认值              描述
  timeBetweenEvictionRunsMillis     1800000           在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位. 如果设置为非正数,则不运行空闲连接回收器线程
    minEvictableIdleTimeMillis     1000 * 60 * 30      连接在池中保持空闲而不被空闲连接回收器线程(如果有)回收的最小时间值,单位毫秒
    numTestsPerEvictionRun             3              在每次空闲连接回收器线程(如果有)运行时检查的连接数量  建议设大点
             
  每过timeBetweenEvictionRunsMillis 时间,就会启动一个线程,校验连接池中闲置时间超过minEvictableIdleTimeMillis的连接对象。  
   
  也就是三步对连接池优化。
     
  补充为了更细的优化还可以对每个连接允许建的 statement个数进行设置.
  参数名                                        默认值             描述
  poolPreparedStatements              false            开启池的prepared statement 池功能
  maxOpenPreparedStatements     不限制         statement池能够同时分配的打开的statements的最大数量, 如果设置为0表示不限制
  
  参考资料:
  http://commons.apache.org/dbcp/configuration.html。


 这是前段时间对数据库做了一个深入的研究后做的一个总结,今天将它贴出来,希望对大家有帮助。

分享到:
评论

相关推荐

    dbcp连接池jar

    DBCP(Database Connection Pool)是Apache组织提供的一种开源数据库连接池组件,主要...总的来说,DBCP连接池是Java应用程序中用于高效管理数据库连接的重要工具,通过合理的配置和使用,可以显著提升系统运行效率。

    common-dbcp2数据库连接池参数说明

    ### common-dbcp2数据库连接池参数详解 随着`commons-dbcp2`的版本更新,数据库连接池的配置也有了相应的调整。为了更好地理解和配置这些参数,本文将详细解析`commons-dbcp2`中的一些关键参数及其意义。 #### 1. ...

    hibernate 连接池配置详解

    ### Hibernate 连接池配置详解 #### 一、概述 在使用Hibernate进行数据库操作时,合理配置连接池是非常重要的一步。连接池可以帮助我们更高效地管理数据库连接资源,避免频繁创建与销毁数据库连接带来的性能开销。...

    DBCP连接池原理分析

    #### DBCP连接池配置参数详解 为了更好地理解DBCP的工作原理及其配置,下面我们详细介绍一些常用的配置参数。 - **maxActive**: 池中允许的最大活动连接数。 - **maxIdle**: 池中允许的最大空闲连接数。 - **...

    dbcp连接池

    **DBCP连接池详解** DBCP(Database Connection Pool)是Apache组织提供的一个开源数据库连接池组件,全称为Apache Commons DBCP。它基于Jakarta-DBCP,是Java应用程序中管理数据库连接的一种高效方式,通过复用已...

    JDBC小组件 对DBCP连接池的封装

    **JDBC小组件对DBCP连接池的封装详解** 在Java开发中,数据库操作是必不可少的一部分,而JDBC(Java Database Connectivity)则是Java与数据库交互的标准接口。然而,直接使用JDBC进行数据库操作存在效率低下、资源...

    DBCP连接池帮助文档

    - 需定期检查和更新连接池配置,以适应应用负载的变化。 - 注意数据库驱动兼容性,确保与使用的JDBC驱动版本匹配。 总结,DBCP连接池是Java应用中常用的一种数据库连接管理工具,通过理解其工作原理,合理配置和...

    DBCP连接池DBCP和C3P0配置

    ### DBCP与C3P0连接池配置详解 #### 一、DBCP与C3P0概述 在Java开发中,数据库连接池是提高应用性能的重要手段之一。通过复用预分配好的数据库连接资源,避免了频繁创建和销毁数据库连接所带来的性能开销。Apache ...

    dbcp连接池优化

    假设有一个基于Tomcat的应用程序,其DBCP连接池配置如下: - `initialSize` = 10 - `maxActive` = 50 - `maxIdle` = 20 - `minIdle` = 5 - `maxWait` = 10000 - `validationQuery` = "SELECT 1" - `testOnBorrow` =...

    proxool连接池配置详解

    ### Proxool连接池配置详解 #### 一、概述 Proxool是一个开源的轻量级Java数据库连接池实现,其主要目标是替代常见的数据库连接池解决方案,如C3P0或DBCP,并且提供了更加灵活和易于配置的特性。在实际应用中,...

    使用DBCP链接池详解附加代码例子

    本文将详细介绍DBCP连接池的配置和使用,并给出实际的代码示例。 4.1 连接池知识简介 数据库连接的建立和关闭是非常消耗资源的过程,因此引入了连接池的概念。连接池在系统启动时预创建一定数量的数据库连接,然后...

    Tomcat连接池配置详解

    **Tomcat连接池配置详解** 在Java Web应用中,数据库连接池是不可或缺的一部分,它能够有效地管理和重用数据库连接,提高应用性能并降低系统资源消耗。Tomcat作为一款流行的Servlet容器,内置了多种连接池实现,如...

    Java各数据库连接池配置介绍

    **DBCP连接池配置** Apache DBCP(Database Connection Pool)是另一个常见的Java数据库连接池。其配置主要包括以下几个关键参数: 1. `driverClassName`:数据库驱动的全限定类名。 2. `url`:数据库连接URL。 3....

    连接池dbcp

    Apache Commons DBCP(Database Connection Pool)是Java社区中广泛使用的连接池实现之一,它提供了高效、稳定的服务。 **Apache Commons DBCP详解:** 1. **简介** Apache Commons DBCP 是Apache软件基金会的一...

    DBCP配置详解

    数据库连接池DBCP配置详解 DBCP(Database Connection Pool)是一个开源的Java数据库连接池实现,它是Apache软件基金会的一个子项目,用于管理和复用数据库连接。DBCP通过一个预分配的连接池来优化管理数据库连接,...

    tomcat6.0连接池配置方法详解

    ### Tomcat 6.0 连接池配置详解 在Java Web开发中,数据库连接池是一种常见的技术,用于管理数据库连接资源,提高系统的性能和稳定性。Tomcat作为一款广泛使用的Java应用服务器,提供了内置的连接池功能,方便...

Global site tag (gtag.js) - Google Analytics