zoukankan      html  css  js  c++  java
  • dbcp 详细配置

    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(一般走了网络请求基本就这数)

    .成本和收益

    网站异常数据库重启,网络异常断开的频率是非常低的,一般也就在数据库升级,演习维护时才会进行,而且一般也是选在晚上,访问量相对比较低的请求,而且一般会有人员值班关注,所以异步的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住,后续的业务处理因为拿不到链接所有都处理失败了


     
  • 相关阅读:
    Codeforces 992C(数学)
    Codeforces 990C (思维)
    Codeforces 989C (构造)
    POJ 1511 Invitation Cards(链式前向星,dij,反向建边)
    Codeforces 1335E2 Three Blocks Palindrome (hard version)(暴力)
    POJ 3273 Monthly Expense(二分)
    POJ 2566 Bound Found(尺取前缀和)
    POJ 1321 棋盘问题(dfs)
    HDU 1506 Largest Rectangle in a Histogram(单调栈)
    POJ 2823 Sliding Window(单调队列)
  • 原文地址:https://www.cnblogs.com/signheart/p/6597971.html
Copyright © 2011-2022 走看看