一:创建连接阶段:
服务器起动时,会建立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。
分享到:
相关推荐
3. **commons-pool-1.5.6.jar**:Apache Commons Pool是对象池设计模式的实现,DBCP连接池依赖于这个库来管理其内部的数据库连接对象。对象池允许开发者在应用程序中复用已经创建的对象,而不是每次需要时都创建新的...
在Web项目开发中,DBCP连接池是不可或缺的一部分,因为它能够有效地管理数据库资源,避免频繁创建和关闭数据库连接,降低系统开销。 首先,让我们来了解一下DBCP的基本概念和工作原理。数据库连接池在初始化时会...
DBCP连接池的工作原理是预先创建一定数量的数据库连接,并将这些连接保存在一个池中。当应用程序需要与数据库交互时,不再直接创建新的连接,而是从连接池中获取已存在的连接。使用完毕后,连接会被归还回池,而不是...
DBCP连接池在Java应用中被广泛使用,尤其是在Web应用服务器中,如Tomcat。 DBCP主要由两个核心组件组成: 1. `commons-dbcp.jar`:这是DBCP的主要库,包含了数据库连接池的实现。它提供了DataSource接口的实现,...
标题中的“dbcp连接池jar包”指的是用于实现数据库连接池功能的Java库,即Commons DBCP的jar文件。这个jar包包含了DBCP所需的全部类和资源,开发者可以通过引入这个jar包到项目中,快速地集成数据库连接池功能。 ...
在SSH(Spring、Struts和Hibernate)这样的经典企业级开发框架中,DBCP连接池是一个常用的数据库管理工具。 1. **数据库连接池概念**:数据库连接池是在应用服务器启动时创建的,它会预先建立一定数量的数据库连接...
总的来说,Java DBCP连接池是Java应用中管理和优化数据库连接的有效工具,通过合理配置和使用,能够显著提升应用的数据库访问性能,同时降低资源消耗。在实际开发中,开发者应根据项目需求和性能要求选择合适的连接...
**DBCP连接池的工作原理:** 1. **初始化**:在应用程序启动时,DBCP会预先创建一定数量的数据库连接并放入连接池。 2. **请求连接**:当程序需要与数据库交互时,它向连接池请求一个连接。连接池检查是否有空闲的...
DBCP(Database Connection Pool)是Apache组织提供的一种开源数据库连接池组件,主要...总的来说,DBCP连接池是Java应用程序中用于高效管理数据库连接的重要工具,通过合理的配置和使用,可以显著提升系统运行效率。
用于实现DBCP连接池所用的JAR依赖文件,包括数据库驱动及创建连接池所需的其他依赖: * commons-collections * commons-dbcp2 * commons-logging * commons-pool2 * mysql-connector
在这个场景中,"dbcp连接池所需包"指的是用于配置和使用DBCP连接池的必要Java档案库(JAR包)。 首先,`commons-dbcp.jar`是DBCP的主要实现包,它包含了一系列用于管理和维护数据库连接的类和接口。这个库提供了...
DBCP(Database Connection Pool)是Apache软件基金会的Commons DBCP项目提供的一个数据库连接池组件,它在Java应用程序中用于管理和复用数据库连接。连接池是提高数据库应用性能的重要手段,通过预先创建并维护一定...
在标题"dbcp连接池常用包"中,"常用包"指的是DBCP连接池所需的必备库文件,这些文件包含了DBCP的不同版本,分别为1.3、1.4和1.5。每个版本可能对应着不同的功能特性和修复的bug,开发者可以根据项目的兼容性和需求...
DBCP连接池配制文件................................
### DBCP连接池原理分析 #### DBCP概述与版本区分 DBCP(Database Connection Pool)是由Apache组织提供的一款开源连接池实现。它能够帮助应用程序有效地管理与数据库的连接资源,通过重用预创建的数据库连接来...
DBCP连接池在应用启动时会预先创建一定数量的数据库连接,并将这些连接放入池中。当应用需要与数据库交互时,它从池中获取一个已建立的连接,用完后再归还回池,而不是每次操作都创建新的连接。这种机制可以显著提高...