1.配置参数

username : 连接用户名

password:  连接密码

url :  连接 url( 如果连接 mysql ,格式为 jdbc:mysql://ip:port/dbname)

driverClassName : jdbc driver 名字 ( 如果是 mysql ,则为com.mysql.jdbc.Driver)

connectionProperties : 当建立一个数据库连接的时候,这些属性参数将传给 jdbc driver ,参数的形式必须是 [propertyName=property;]*  。

注: username 和 password 必须明确的传给 driver, 不必包含在这个属性中。

initialSize : 默认值是 0, 连接池创建连接的初始连接数目

maxActive : 默认值是 8, 连接池中同时可以分派的最大活跃连接数

maxIdle : 默认是 8 ,连接池中最大空闲连接数

minIdle : 默认是 0, 连接数中最小空闲连接数

maxWait : 默认值是无限大,当连接池中连接已经用完了,等待建立一个新连接的最大毫秒数 ( 在抛异常之前 )

validationQuery : 一条 sql 语句,用来验证数据库连接是否正常。这条语句必须是一个查询模式,并至少返回一条数据。一般用“ select 1 ”

testOnBorrow : 默认值是 true ,当从连接池取连接时,验证这个连接是否有效

testOnReturn : 默认值是 flase, 当从把该连接放回到连接池的时,验证这个连接是否有效

testWhileIdle : 默认值是 false, 当连接池中的空闲连接是否有效

timeBetweenEvictionRunsMilis : 默认值是 -1 ,每隔一段多少毫秒跑一次回收空闲线程的线程

numTestsPerEvictionRun : 默认值是 3 ,每次验证空闲连接的连接数目

minEvictableIdleTimeMilis : 默认值是 1000 * 60 * 30(30 分钟 ) ,连接池中连接可空闲的时间

connectionInitSqls : 默认值是 null, 一组用来初始化连接的 sql 语句,这些语句只在连接工厂创建连接时执行一次。

removeAbandoned : 默认值是 false, 是否清理 removeAbandonedTimeout 秒没有使用的活动连接 , 清理后并没有放回连接池

removeAbandonedTimeout : 默认值是 300( 秒 ), 活动连接的最大空闲时间

logAbandoned : 默认值 false, 连接池收回空闲的活动连接时是否打印消息

注:

1. 红色字体的属性一般都会设置

2.   minEvictableIdleTimeMilis,removeAbandonedTimeout 这两个参数针对的连接对象不一样,minEvictableIdleTimeMillis 针对连接池中的连接对象 ,removeAbandonedTimeout 针对未被 close 的活动连接 (被调用,不在池中的连接对象 )

3.   maxWait 、 timeBetweenEvictionRunsMilis 、 minEvictableIdleTimeMilis 单位是毫秒,removeAbandonedTimeout 单位是秒

2. 异常处理

dbcp是采用了commons-pool做为其连接池治理,testOnBorrow,testOnReturn, testWhileIdle是pool是提供的几种校验机制,通过外部钩子的方式回调dbcp的相关数据库链接(validationQuery)校验 
testOnBorrow : 顾明思义,就是在进行borrowObject进行处理时,对拿到的connection进行validateObject校验 
testOnReturn : 顾明思义,就是在进行returnObject对返回的connection进行validateObject校验,个人觉得对数据库连接池的治理意义不大 
testWhileIdle : 关注的重点,GenericObjectPool中针对pool治理,起了一个Evict的TimerTask定时线程进行控制(可通过设置参数timeBetweenEvictionRunsMillis>0),定时对线程池中的链接进行validateObject校验,对无效的链接进行封闭后,会调用ensureMinIdle,适当建立链接保证最小的minIdle连接数。 
timeBetweenEvictionRunsMillis,设置的Evict线程的时间,单位ms,大于0才会开启evict检查线程
validateQuery, 代表检查的sql 
validateQueryTimeout, 代表在执行检查时,通过statement设置,statement.setQueryTimeout(validationQueryTimeout) 
numTestsPerEvictionRun,代表每次检查链接的数目,建议设置和maxActive一样大,这样每次可以有效检查所有的链接. 

数据库链接 常见的问题:

1. 数据库意外重启后,原先的数据库连接池能自动废弃老的无用的链接,建立新的数据库链接

2. 网络异常中断后,原先的建立的 tcp 链接,应该能进行自动切换。比如网站演习中的交换机重启会导致网络瞬断

3. 分布式数据库中间件,会定时的将空闲链接异常关闭,客户端会出现半开的空闲链接。

大致思考解决思路:

1.      sql 心跳检查 ( 主动式 )

2.      拿链接尝试一下,发现处理失败丢弃链接,探雷的请求会失败几个  ( 牺牲小我,完成大我的精神 )

3.      设置合理的空闲链接的超时时间,避免半开链接 ( 懒模式,解决半开链接 )

sql 心跳检查

sql validate 配置

<property name= "testWhileIdle" ><value> true </value></property>

<property name= "testOnBorrow" ><value> false </value></property>

<property name= "testOnReturn" ><value> false </value></property>

<property name= "validationQuery" ><value>select sysdate from dual</value></property>

<property name= "validationQueryTimeout" ><value>1</value></property>

<property name= "timeBetweenEvictionRunsMillis" ><value>30000</value></property>

<property name= "numTestsPerEvictionRun" ><value>16</value></property>

参数说明

dbcp 是采用了 commons-pool 做为其连接池管理, testOnBorrow,testOnReturn, testWhileIdle 是 pool 是提供的几种校验机制,通过外部钩子的方式回调 dbcp 的相关数据库链接 (validationQuery) 校验 , dbcp 相关外部钩子类: PoolableConnectionFactory, 继承于 common-pool PoolableObjectFactory , dbcp 通过GenericObjectPool 这一入口,进行连接池的 borrow,return 处理。

具体参数描述:

1. testOnBorrow : 顾明思义,就是在进行borrowObject进行处理时,对拿到的connection进行validateObject校验

2. testOnReturn : 顾明思义,就是在进行returnObject对返回的connection进行validateObject校验,个人觉得对数据库连接池的管理意义不大

3. testWhileIdle : 关注的重点,GenericObjectPool中针对pool管理,起了一个 异步Evict的TimerTask定时线程进行控制 ( 可通过设置参数 timeBetweenEvictionRunsMillis>0), 定时对线程池中的链接进行validateObject校验,对无效的链接进行关闭后,会调用ensureMinIdle,适当建立链接保证最小的minIdle连接数。

4. timeBetweenEvictionRunsMillis, 设置的Evict线程的时间,单位ms,大于0才会开启evict检查线程

5. validateQuery , 代表检查的sql

6. validateQueryTimeout , 代表在执行检查时,通过statement设置,statement.setQueryTimeout(validationQueryTimeout)

7. numTestsPerEvictionRun ,代表每次检查链接的数量,建议设置和maxActive一样大,这样每次可以有效检查所有的链接.

Sql 心跳检查几点思考:

1. 性能问题。

目前网站的应用大部分的瓶颈还是在I/O这一块,大部分的I/O还是在数据库的这一层面上,每一个请求可能会调用10来次SQL查询,如果不走事务,一个请求会重复获取链接,如果每次获取链接,比如在testOnBorrow都进行validateObject,性能开销不是很能接受,可以假定一次SQL操作消毫0.5~1ms(一般走了网络请求基本就这数)

2 .成本和收益

网站异常数据库重启,网络异常断开的频率是非常低的,一般也就在数据库升级,演习维护时才会进行,而且一般也是选在晚上,访问量相对比较低的请求,而且一般会有人员值班关注,所以异步的validateObject是可以接受,但一个前提需要确保能保证在一个合理的时间段内,数据库能完成自动重联。

请求探雷

相关配置

dbcp 自身默认支持,不需要配置

原理描述

common-pools 通过borrowObject , returnObject完成连接的获取和释放,正常的情况是一次请求中borrow和return是一对的,有借就有还。

但在准备returnObject时,dbcp会做一件事,就是看看这个object是否已经是坏了的,如果坏了就直接丢了,就直接给丢弃了。

代码层面:

1. 在dbcp中PoolingDataSource(实现DataSource接口)调用 PoolableConnection(dbcp connnection 相关的pool delegate操作)进行相应关闭时,会检查 _conn.isClosed() ,针对DataSource如果isClosed返回为 true的则不调用returnObject,直接丢弃了链接。

2. _conn.isClosed()是否保险,从jdk的api描述中: A connection is closed if the method close has been called on it or if certain fatal errors have occurred. 里面提供两种情况,一种就是被调用了closed方法,另一种就是出现一些异常,说的比较含糊。

空闲链接检查

相关配置

<property name="minEvictableIdleTimeMillis "><value>18000000</value></property>

<property name="removeAbandoned" ><value>true</value></property>

<property name="removeAbandonedTimeout "><value>180</value></property>

参数说明

1. minEvictableIdleTimeMillis  dbcp默认是30分,需要开启异步线程Evict,否则不生效。原理很简单,就是通过一个异步线程,每次检查connnection上一次使用的时间戳,看看是否已经超过这个timeout时间设置。

2. removeAbandoned , removeAbandonedTimeout ,主要是用于在出现链接紧张时候,会扫描一些链接未超过removeAbandonedTimeout时间还未被释放,会主动的关闭该链接。

适用情况

1. 我们使用的cobar后端会有定时关闭空闲链接的操作,默认的空闲链接timeout时间为1小时,和其他oracle , mysql 各不相同,所以设置好这个空闲链接的timeout时间还是挺重要.

2. 一般会是几种情况出现需要removeAbandoned: 

* 代码未在finally释放connection ,  不过我们都用sqlmapClientTemplate,底层都有链接释放的过程

* 遇到数据库死锁 。以前遇到过后端存储过程做了锁表操作,导致前台集群中连接池全都被block住,后续的业务处理因为拿不到链接所有都处理失败了

dbcp 详细配置的更多相关文章

  1. c3p0详细配置

    c3p0详细配置 官方文档 : http://www.mchange.com/projects/c3p0/index.html <c3p0-config> <default-conf ...

  2. linux 做gw(nat)详细配置

                          linux 做企业网关gw(nat)详细配置   最近因为公司的路由器老化导致上网时断时续,上半小时网就断一次网,为此我头疼不已,本着为公司节约成本的宗旨, ...

  3. (转)springMVC+mybatis+ehcache详细配置

    一. Mybatis+Ehcache配置 为了提高MyBatis的性能,有时候我们需要加入缓存支持,目前用的比较多的缓存莫过于ehcache缓存了,ehcache性能强大,而且位各种应用都提供了解决方 ...

  4. 百度在线编辑器UEditor(v1.3.6) .net环境下详细配置教程之更改图片和附件上传路径

    本文是接上一篇博客,如果有疑问请先阅读上一篇:百度在线编辑器UEditor(v1.3.6) .net环境下详细配置教程 默认UEditor上传图片的路径是,编辑器包目录里面的net目录下 下面就演示如 ...

  5. apache 虚拟主机详细配置:http.conf配置详解

    apache 虚拟主机详细配置:http.conf配置详解 Apache的配置文件http.conf参数含义详解 Apache的配置由httpd.conf文件配置,因此下面的配置指令都是在httpd. ...

  6. HighCharts学习笔记(二)HighCharts结构及详细配置

    HighCharts结构及详细配置: 一.HighCharts整体结构: 通过查看API文档我们知道HighCharts结构如下:(API文档在文章后面提供下载) var chart = new Hi ...

  7. vsftp详细配置(转)

    详细配置转载来自以下链接: http://yuanbin.blog.51cto.com/363003/108262 vsftp源码下载(vsftpd-3.0.2.tar.gz): http://dow ...

  8. proxool详细配置

    proxool详细配置 博客分类: Java 配置管理SQLServletprototypeXML  proxool一个数据库连接池框架,提供了对你选择的其它类型的驱动程序的连接池封装.可以非常简单的 ...

  9. Window VNC远程控制LINUX:VNC详细配置介绍

    Window VNC远程控制LINUX:VNC详细配置介绍 //---------------------------------------vnc linux下的详细配置 1.VNC的启动/停止/重 ...

随机推荐

  1. 利用shell监控cpu、磁盘、内存使用率

    利用shell监控cpu.磁盘.内存使用率,达到警报阈值发邮件进行通知 并配合任务计划,即可及时获取报警信息 #!/bin/bash ################################# ...

  2. (剑指Offer)面试题13:在O(1)时间内删除链表结点

    题目: 在给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间内删除该结点.链表结点与函数的定义如下: struct ListNode{ int val; ListNode* next; } ...

  3. Discuz常见小问题-如何设置163邮箱注册验证

    参考网址: https://jingyan.baidu.com/album/c843ea0b804a6e77931e4aa7.html?picindex=3 http://www.discuz.net ...

  4. PHP中调用外部命令的方法

    在PHP中调用外部命令,可以用如下三种方法来实现: 方法一:用PHP提供的专门函数(四个): PHP提供4个专门的执行外部命令的函数:exec(), system(), passthru(), she ...

  5. Java中equals和==的解析

    java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(== ...

  6. Unity Game Starter Kit for Windows Store and Windows Phone Store games

    原地址:http://digitalerr0r.wordpress.com/2013/09/30/unity-game-starter-kit-for-windows-store-and-window ...

  7. 〖Linux〗Bash快捷键使用

    这篇 Bash Shell Shortcuts 的快捷键总结的非常好.值得学习.下面内容大多数是拷贝粘贴与总结. CTRL 键相关的快捷键: Ctrl + a - Jump to the start ...

  8. 怎样获取oracle dbid

    1.查询v$database获得 因为DBID在控制文件和数据文件里都存在记录,所以假设可以mount数据库就行查询v$database视图获得.  SQL> alter database mo ...

  9. MySQL中的锁、隔离等级和读场景

    一.导言 关于MySQL中的锁还有隔离等级这类话题,其概念性的解释早已泛滥.记住其概念,算不上什么.更重要的是思考:他们的区别和联系在哪儿,为什么会有这样的概念. 1)MySQL的锁(Lock)分为行 ...

  10. 解析theme()

    drupal_render()只是对theme()的调用做了包装,真正做任务的还是theme(). function theme($hook, $variables = array()) { ... ...