DBCP连接池介绍

DBCP连接池介绍

-----------------------------

目前 DBCP 有两个版本分别是 1.3 和 1.4。

DBCP 1.3 版本需要运行于 JDK 1.4-1.5 ,支持 JDBC 3。

DBCP 1.4 版本需要运行于 JDK 1.6 ,支持 JDBC 4。

1.3和1.4基于同一套源代码,含有所有的bug修复和新特性。因此在选择DBCP版本的时候,要看你用的是什么JDK版本。

DBCP1.2版本性能一般,比c3p0差挺多。DBCP1.4和1.3,配合(依赖)commons pool 1.6的jar包,各方面功能、性能推进到新的高峰。相对1.2版本提高不少。超越(或相当)了c3p0.建议使用DBCP1.4或1.3 +  commons pool 1.6

 

Tomcat7 中保留DBCP连接池,以兼容已有应用。并提供了新的Tomcat JDBC pool作为DBCP的可选替代。新出的Tomcat JDBC pool,据说比DBCP 1.4要好,未接触,也不在本文讨论范围内。

 

DBCP连接池配置参数讲解

-----------------------------

一、Apache官方DBCP文档给出的配置示例:

可参见:http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html

<Context>

  <Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"

               maxActive="100" maxIdle="30" maxWait="10000"

               username="javauser" password="javadude" driverClassName="com.mysql.jdbc.Driver"

               url="jdbc:mysql://localhost:3306/javatest"/>

</Context>

 

二、常用参数说明:

可参见:http://elf8848.iteye.com/blog/337981

<Resource

name="jdbc/TestDB"  JNDI数据源的name

type="javax.sql.DataSource"

 

driverClassName="com.mysql.jdbc.Driver" JDBC驱动类

url=""

username="" 访问数据库用户名

password="" 访问数据库的密码

 

maxActive="80" 最大活动连接

initialSize="10"  初始化连接

maxIdle="60"   最大空闲连接

minIdle="10"   最小空闲连接

maxWait="3000" 从池中取连接的最大等待时间,单位ms.

 

    validationQuery = "SELECT 1"  验证使用的SQL语句

    testWhileIdle = "true"      指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除.

    testOnBorrow = "false"   借出连接时不要测试,否则很影响性能

    timeBetweenEvictionRunsMillis = "30000"  每30秒运行一次空闲连接回收器

    minEvictableIdleTimeMillis = "1800000"  池中的连接空闲30分钟后被回收

    numTestsPerEvictionRun="3" 在每次空闲连接回收器线程(如果有)运行时检查的连接数量

    

    removeAbandoned="true"  连接泄漏回收参数,当可用连接数少于3个时才执行

    removeAbandonedTimeout="180"  连接泄漏回收参数,180秒,泄露的连接可以被删除的超时值

/>

 

DBCP连接池的自我检测

-----------------------------

默认配置的DBCP连接池,是不对池中的连接做测试的,有时连接已断开了,但DBCP连接池不知道,还以为连接是好的呢。

应用从池中取出这样的连接访问数据库一定会报错。这也是好多人不喜欢DBCP的原因。

 

问题例一:

MySQL8小时问题,Mysql服务器默认连接的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该 connection。

但是DBCP连接池并不知道连接已经断开了,如果程序正巧使用到这个已经断开的连接,程序就会报错误。

 

问题例二:

    以前还使用Sybase数据库,由于某种原因,数据库死了后重启、或断网后恢复。

    等了约10分钟后,DBCP连接池中的连接还都是不能使用的(断开的),访问数据应用一直报错,最后只能重启Tomcat问题才解决 。

 

解决方案:

    方案1、定时对连接做测试,测试失败就关闭连接。

    方案2、控制连接的空闲时间达到N分钟,就关闭连接,(然后可再新建连接)。

    以上两个方案使用任意一个就可以解决以述两类问题。如果只使用方案2,建议 N <= 5分钟。连接断开后最多5分钟后可恢复。

    也可混合使用两个方案,建议 N = 30分钟。

    

    下面就是DBCP连接池,同时使用了以上两个方案的配置配置

    validationQuery = "SELECT 1"  验证连接是否可用,使用的SQL语句

    testWhileIdle = "true"      指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除.

    testOnBorrow = "false"   借出连接时不要测试,否则很影响性能

    timeBetweenEvictionRunsMillis = "30000"  每30秒运行一次空闲连接回收器

    minEvictableIdleTimeMillis = "1800000"  池中的连接空闲30分钟后被回收,默认值就是30分钟。

    numTestsPerEvictionRun="3" 在每次空闲连接回收器线程(如果有)运行时检查的连接数量,默认值就是3.

    

    解释:

    配置timeBetweenEvictionRunsMillis = "30000"后,每30秒运行一次空闲连接回收器(独立线程)。并每次检查3个连接,如果连接空闲时间超过30分钟就销毁。销毁连接后,连接数量就少了,如果小于minIdle数量,就新建连接,维护数量不少于minIdle,过行了新老更替。

    testWhileIdle = "true" 表示每30秒,取出3条连接,使用validationQuery = "SELECT 1" 中的SQL进行测试 ,测试不成功就销毁连接。销毁连接后,连接数量就少了,如果小于minIdle数量,就新建连接。

    testOnBorrow = "false" 一定要配置,因为它的默认值是true。false表示每次从连接池中取出连接时,不需要执行validationQuery = "SELECT 1" 中的SQL进行测试。若配置为true,对性能有非常大的影响,性能会下降7-10倍。所在一定要配置为false.

    每30秒,取出numTestsPerEvictionRun条连接(本例是3,也是默认值),发出"SELECT 1" SQL语句进行测试 ,测试过的连接不算是“被使用”了,还算是空闲的。连接空闲30分钟后会被销毁。

    

 

DBCP连接池配置参数注意事项  

-----------------------------

maxIdle值与maxActive值应配置的接近。

因为,当连接数超过maxIdle值后,刚刚使用完的连接(刚刚空闲下来)会立即被销毁。而不是我想要的空闲M秒后再销毁起一个缓冲作用。这一点DBCP做的可能与你想像的不一样。

若maxIdle与maxActive相差较大,在高负载的系统中会导致频繁的创建、销毁连接,连接数在maxIdle与maxActive间快速频繁波动,这不是我想要的。

高负载系统的maxIdle值可以设置为与maxActive相同或设置为-1(-1表示不限制),让连接数量在minIdle与maxIdle间缓冲慢速波动。

 

timeBetweenEvictionRunsMillis建议设置值

initialSize="5",会在tomcat一启动时,创建5条连接,效果很理想。

但同时我们还配置了minIdle="10",也就是说,最少要保持10条连接,那现在只有5条连接,哪什么时候再创建少的5条连接呢?

1、等业务压力上来了, DBCP就会创建新的连接。

2、配置timeBetweenEvictionRunsMillis=“时间”,DBCP会启用独立的工作线程定时检查,补上少的5条连接。销毁多余的连接也是同理。

 

连接销毁的逻辑

------------------------------

DBCP的连接数会在  0 - minIdle - maxIdle - maxActive  之间变化。变化的逻辑描述如下:

 

默认未配置initialSize(默认值是0)和timeBetweenEvictionRunsMillis参数时,刚启动tomcat时,连接数是0。当应用有一个并发访问数据库时DBCP创建一个连接。

目前连接数量还未达到minIdle,但DBCP也不自动创建新连接已使数量达到minIdle数量(没有一个独立的工作线程来检查和创建)。

随着应用并发访问数据库的增多,连接数也增多,但都与minIdle值无关,很快minIdle被超越,minIdle值一点用都没有。

直到连接的数量达到maxIdle值,这时的连接都是只增不减的。 再继续发展,连接数再增多并超过maxIdle时,使用完的连接(刚刚空闲下来的)会立即关闭,总体连接的数量稳定在maxIdle但不会超过maxIdle。

但活动连接(在使用中的连接)可能数量上瞬间超过maxIdle,但永远不会超过maxActive。

这时如果应用业务压力小了,访问数据库的并发少了,连接数也不会减少(没有一个独立的线程来检查和销毁),将保持在maxIdle的数量。

 

默认未配置initialSize(默认值是0),但配置了timeBetweenEvictionRunsMillis=“30000”(30秒)参数时,刚启动tomcat时,连接数是0。马上应用有一个并发访问数据库时DBCP创建一个连接。

目前连接数量还未达到minIdle,每30秒DBCP的工作线程检查连接数是否少于minIdle数量,若少于就创建新连接直到达到minIdle数量。

随着应用并发访问数据库的增多,连接数也增多,直到达到maxIdle值。这期间每30秒DBCP的工作线程检查连接是否空闲了30分钟,若是就销毁。但此时是业务的高峰期,是不会有长达30分钟的空闲连接的,工作线程查了也是白查,但它在工作。到这里连接数量一直是呈现增长的趋势。

当连接数再增多超过maxIdle时,使用完的连接(刚刚空闲下来)会立即关闭,总体连接的数量稳定在maxIdle。停止了增长的趋势。但活动连接(在使用中的连接)可能数量上瞬间超过maxIdle,但永远不会超过maxActive。

这时如果应用业务压力小了,访问数据库的并发少了,每30秒DBCP的工作线程检查连接(默认每次查3条)是否空闲达到30分钟(这是默认值),若连接空闲达到30分钟,就销毁连接。这时连接数减少了,呈下降趋势,将从maxIdle走向minIdle。当小于minIdle值时,则DBCP创建新连接已使数量稳定在minIdle,并进行着新老更替。

 

配置initialSize=“10”时,tomcat一启动就创建10条连接。其它同上。

 

minIdle要与timeBetweenEvictionRunsMillis配合使用才有用,单独使用minIdle不会起作用。

 

 

Tomcat中配置DBCP连接池

-----------------------------

Tomcat自带DBCP的包,是$CATALINA_HOME/lib/tomcat-dbcp.jar。

tomcat-dbcp.jar含有commons pool、commons DBCP两个包的内容。但只含有与连接池有关的类。

数据源配置在context.xml文件中, 要在tomcat的lib目录中放jdbc 驱动包

数据源配置在server.xml的host中,不需要在tomcat的lib目录中放jdbc 驱动包,只使用工程中的jdbc驱动包

 

 

JNDI配置:更改tomcat的server.xml或context.xml

 

    全局的数据源:

    如果需要配置全局的 Resource,则在server.xml的GlobalNamingResources节点里加入Resource,再在Context节点里加入ResourceLink的配置。

    全局的resource只是为了重用,方便所有该tomcat下的web工程的数据源管理,但如果你的tomcat不会同时加载多个web工程,也就是说一个tomcat只加载一个web工程时,是没有必要配置全局的resource的。

 

每个web工程一个数据源:

在$CATALINA_HOME/conf/context.xml的根节点Context里加入Resource配置。这种配置方法,你在context.xml配置了一个数据源,但Tomcat中有同时运行着5个工程,那了就坏事儿了,这个在Tomcat启动时数据源被创建了5份,每个工程1份数据源。连接数会是你配置的参数的5倍。

只有在你的Tomcat只加载一个web工程时,才可以直接以context.xml配置数据源。

 

<Resource name="jdbc/testDB"       //指定的jndi名称,会用于spring数据源bean的配置和ResourceLink的配置

               type="javax.sql.DataSource"   //数据源床型,使用标准的javax.sql.DataSource

               driverClassName="com.mysql.jdbc.Driver"    //JDBC驱动器 

               url="jdbc:mysql://localhost:3306/test" //数据库URL地址             

               username="test"     //数据库用户名

               password="test"   //数据库密码

               maxIdle="40"   //最大的空闲连接数

               maxWait="4000" //当池的数据库连接已经被占用的时候,最大等待时间

               maxActive="40" //连接池当中最大的数据库连接

               removeAbandoned="true" 

               removeAbandonedTimeout="180"

               logAbandoned="true" //被丢弃的数据库连接是否做记录,以便跟踪

               factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory" />

 

      这里的factory指的是该Resource 配置使用的是哪个数据源配置类,这里使用的是tomcat自带的标准数据源Resource配置类,这个类也可以自己写,实现javax.naming.spi.ObjectFactory 接口即可。某些地方使用的commons-dbcp.jar中的org.apache.commons.dbcp.BasicDataSourceFactory,如果使用这个就需把commons-dbcp.jar及其依赖的jar包,都放在tomcat的lib下,光放在工程的WEB-INF/lib下是不够的。

 

     ResourceLink 的配置有多种:

 

     1)tomcat安装目录下的conf/context.xml,把全局的resource直接公开给该tomcat下的所有web工程,在Context节点中加入:

<ResourceLink global="jdbc/testMDB" name="jdbc/testMDB" type="javax.sql.DataSource"/>   

不建议在此文件中,不使用<ResourceLink/>,而使用<Resource/>直接配置数据源,原因上面已说明了。   

 

     2)tomcat安装目录下的conf/server.xml,该方法可以指定把哪些source绑定到哪个web工程下。

<!-- 新增,第一行为加载的工程配置,第二行是该工程需要的ResourceLink配置 -->

<context docBase="/web/webapps/phoenix" path="" reloadable="false"> 

      <ResourceLink global="jdbc/testMDB" name="jdbc/testMDB" type="javax.sql.DataSource"/>

</context>

也可在此文件中,不使用<ResourceLink/>,而使用<Resource/>直接配置数据源。

 

     3)安装目录下的conf/localhost/下建立一个xml文件,文件名是<yourAppName>.xml。比如工程名为test,则该xml名为test.xml。

<?xml version="1.0" encoding="UTF-8"?>

<Context>   

    <ResourceLink global="jdbc/testMDB" name="jdbc/testMDB" type="javax.sql.DataSource"/>       

</context>

也可在此文件中,不使用<ResourceLink/>,而使用<Resource/>直接配置数据源。

 

     4)tomcat安装目录下的\webapps\test\META-INF\context.xml的Context节点中增加:

<ResourceLink global="jdbc/testMDB" name="jdbc/testMDB" type="javax.sql.DataSource"/>

也可在此文件中,不使用<ResourceLink/>,而使用<Resource/>直接配置数据源。

 

 

本文内容都在tomcat6.0上运行测试过,还下载了commons DBCP的源码,加入了跟踪日志,用于验证本文的理论。

 

连接池排名(纯个人看法)

-----------------------------

Tomcat JDBC pool

DBCP 1.4

c3p0   速度不错

BoneCP 速度不错,但会启用很多附加线程做回收、关闭工作。

Proxool 在高并发时出现异常

DBCP 1.2

DBPool 最差,垫底。

参考文档《Java连接池评估报告》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/539906.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux解释名词shell环境,Linux 定时任务

实现linux定时任务有:cron、anacron、at等&#xff0c;这里主要介绍cron服务。名词解释&#xff1a;cron是服务名称&#xff0c;crond是后台进程&#xff0c;crontab则是定制好的计划任务表。软件包安装&#xff1a;要使用cron服务&#xff0c;先要安装vixie-cron软件包和cront…

Python3 实现用户登陆,输入三次密码

不加注释版 #/usr/bin/python3 import readline user "seven" passwd "123" username input("please the enter user:") for i in range(3):password input("please the enter password:")if password.isdigit():password int(pa…

linux pcre静态编译,Linux下,Nginx部署静态网站

1、准备工作选首先安装这几个软件&#xff1a;GCC&#xff0c;PCRE(Perl Compatible Regular Expression)&#xff0c;zlib&#xff0c;OpenSSL。Nginx是C写的&#xff0c;需要用GCC编译&#xff1b;Nginx的Rewrite和HTTP模块会用到PCRE&#xff1b;Nginx中的Gzip用到zlib&…

【HTML5初探之本地存储】如果没有数据库。。。

导航【初探HTML5之使用新标签布局】用html5布局我的博客页&#xff01;【HTML5初探之form标签】解放表单验证、增加文件上传、集成拖放【HTML5初探之绘制图像&#xff08;上&#xff09;】看我canvas元素引领下一代web页面【HTML5初探之绘制图像&#xff08;下&#xff09;】看…

FragmentActivity和Activity的具体区别

fragment是3.0以后的东西&#xff0c;为了在低版本中使用fragment就要用到android-support-v4.jar兼容包,而fragmentActivity就是这个兼容包里面的&#xff0c;它提供了操作fragment的一些方法&#xff0c;其功能跟3.0及以后的版本的Activity的功能一样。 下面是API中的原话&am…

算法理论

ylbtech-Arithmetic:算法理论-- -- ylb&#xff1a;算法-- Type:算法-- 简简单单的一个月&#xff0c;完成一个台阶的提升-- 1&#xff0c;着重于算法的研究&#xff08;谢谢她为我出的那道题&#xff09;-- 2&#xff0c;可以不太依附工具环境开发&#xff0c;现在,也可使用记…

linux环境OpenRASP使用教程,集成openRASP与攻击测试

1.介绍openRASP是一个百度的安全框架&#xff0c;将其集成到我们的web项目中&#xff0c;就像是给web项目安装了一款“安全管家”的软件&#xff0c;它可以检测到攻击&#xff0c;并进行拦截。2.集成openRASP到项目中openRASP针对不同的服务器&#xff0c;提供了不同的安装方法…

JQuery调用iframe子页面函数/对象的方法

JQuery调用iframe子页面函数/对象的方法例子&#xff1a; 父页面有个ID为mainfrm的iframe&#xff0c;iframe连接b.html&#xff0c;该页面有个函数test 在父页面调用b.html的test方法为&#xff1a; $("#mainfrm")[0].contentWindow.test();

ExtJs 备忘录(4)—— Form表单(四) [ 数据提交 ]

一、截图和示例共用Ext.FormPanel1.1  截图由于本文主要关注的是表单提交的几种方式&#xff0c;所以仅用了一个表单项以便于测试和减少示例代码。1.2  示例共用Ext.FormPanel <script type"text/javascript">Ext.onReady(function() { Ext.Qui…

web.xml文件的作用

每个javaEE工程中都有web.xml文件&#xff0c;那么它的作用是什么呢&#xff1f;它是每个web.xml工程都必须的吗&#xff1f; 一个web中可以没有web.xml文件&#xff0c;也就是说&#xff0c;web.xml文件并不是web工程必须的。 web.xml文件是用来初始化配置信息&#xff1…

linux 扫描mipi设备,VS-RK3399 在linux系统下面调试Mipi camera接口介绍

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼debian系统目前支持Usb camera是没有问题&#xff0c;走UVC功能接口。那么mipi 接口camera和并口接口的camera&#xff0c;在Debian系统怎么设置呢&#xff0c;其实原理一样&#xff0c;也走uvc接口封装函数.下面深圳视壮给大家简单…

hadoop window 搭建

hadoop 原理参考&#xff1a;用 Hadoop 进行分布式并行编程官方中文文档&#xff1a;http://hadoop.apache.org/core/docs/r0.18.2/cn/index.html1. 首先安装 cygwin ssh 参考 windows ssh 搭建2. 搭建hadoop 参考 Cygwin下的Hadoop快速入门-伪分布式模式的查缺补漏 这里…

一篇文章解释struts常用功能

一、什么是框架&#xff1f; 来源于建筑行业&#xff0c;如果建筑一个茅草屋&#xff0c;不需要框架&#xff0c;如果建造一个几个亿的摩天大楼&#xff0c;就需要框架。 小系统用框架浪费人力&#xff0c;中大型系统用框架。 软件中的框架&#xff0c;是一种半成品。实现了一些…

webpack 3 零基础入门教程 #12 - 如何使用模块热替换 HMR 来处理 CSS

模块热替换 是什么意思&#xff1f; 以前我们使用的 webpack --watch 或 webpack-dev-server 的功能是监听文件改变&#xff0c;就自动刷新浏览器&#xff0c;而这个 模块热替换 不用刷新浏览器&#xff0c;它是只让修改到的模块&#xff0c;才会在浏览器上发生相应的变化&…

struts2访问jsp页面404

问题描述 在搭建struts2环境的时候&#xff0c;拷贝了web.xml&#xff0c;拷贝了struts.xml&#xff0c;拷贝了jar包。运行&#xff0c;正常&#xff0c;访问jsp页面&#xff0c;报404错误。 web.xml <?xml version"1.0" encoding"UTF-8"?> <w…

centos7定制linux镜像,自定制Centos7.3系统镜像(ISO)

本文主要介绍如何根据官方的Centos镜像文件&#xff0c;在保留原有默认安装的RPM包的基础下&#xff0c;添加自己所需要的RPM包的&#xff0c;最终生成一个自定制版的ISO&#xff0c;节省了宝贵的时间并确保了安装的定制性。对于其他没有介绍的修改&#xff0c;后续在实践中会进…

调用打开另外一个APK

2019独角兽企业重金招聘Python工程师标准>>> Intent mIntent new Intent(); mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ComponentName comp new ComponentName("com.mm.android.direct.gdmssphoneLite", "com.mm.android.direct.gdmsspho…

Jquery Mobile dialog的生命周期

JQuery Mobile对htm5的移动开发绝对是个好用的东西&#xff0c;今天简单谈谈JQuery Mobile中的dialog的使用。 1.对话框的弹出。 2.对话框的生命周期。 3.对话框内事件的注册。 1&#xff09;第一个问题&#xff1a;对话框的弹出。 如果要弹出一个对话框&#xff0c;可以在页面…

基本linux命令vi,基本linux和vi命令.pdf

基本linux和vi命令DETIBIHORP ___________________YLTCIR 附录 BTSSIR 基本的 Linux 和ETUP vi 命令 yM lO nC oS___________________I eH sT uM NOR OF IS TL AAI RR OET PA RMT OIK

集成Java内容仓库和Spring

JCR模块 Spring Modules的一部分&#xff0c;JCR模块的主要目标是&#xff1a;以一种类似Spring主分发包中ORM包的方式&#xff0c;简化使用JSR-170 API进行开发。特点如下&#xff1a; JcrTemplate&#xff0c;允许执行JcrCallback和异常处理&#xff08;将需检查的JCR异常转换…