zoukankan      html  css  js  c++  java
  • 大话数据库连接池

    1. 为什么使用连接池

    短连接

    短连接是指程序和数据库通信时需要建立连接,执行操作后,连接关闭。短连接简单来说就是每一次操作数据库,都要打开和关闭数据库连接,基本步骤是:连接→数据传输→关闭连接。

    在慢速网络下使用短连接,连接的开销会很大;在生产繁忙的系统中,连接也可能会受到系统端口数的限制,如果要每秒建立几千个连接,那么连接断开后,端口不会被马上回收利用,必须经历一个 “FIN” 阶段的等待,直到可被回收利用为止,这样就可能会导致端口资源不够用。

    长连接

    长连接是指程序之间的连接在建立之后,就一直打开,被后续程序重用。使用长连接的初衷是减少连接的开销,尽管 MySQL 的连接比其他数据库要快得多。

    对此,研发工程师、系统运维工程师、DBA 需要保持沟通,确定合理的连接策略,千万不要不假思索就采用长连接。

    连接池

    由于一些数据库创建和销毁连接的开销很大,或者相对于所执行的具体数据操作,连接所耗的资源过多,此时就可能需要添加连接池来改进性能。

    数据库连接池是一些网络代理服务或应用服务器实现的特性,如 J2EE 服务器,它实现了一个持久连接的 “池”,允许其他程序、客户端来连接,这个连接池将被所有连接的客户端共享使用,连接池可以加速连接,也可以减少数据库连接,降低数据库服务器的负载。

    1. 链接池的选择

    常用的主流开源数据库连接池有 C3P0,DBCP,Tomcat Jdbc Pool,BoneCP, Druid,HikariCP

    HikariCP:https://github.com/brettwooldridge/HikariCP

    Druid: https://github.com/alibaba/druid

    为何要使用 HiKariCP?这要先从 BoneCP 说起:
    什么?不是有 C3P0/DBCP 这些成熟的数据库连接池吗?一直用的好好的,为什么又搞出一个 BoneCP 来?因为,传说中 BoneCP 在快速这个特点上做到了极致,官方数据是 C3P0 等的 25 倍左右。

    3 Druid 连接池配置

    特点:https://github.com/alibaba/druid/wiki/Druid%E8%BF%9E%E6%8E%A5%E6%B1%A0%E4%BB%8B%E7%BB%8D

    配置参数:https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE

    属性列表:https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E5%88%97%E8%A1%A8

    需要注意的点:

    **   (1). 根据业务的实际情况配置链接参数**

    **   (2). 链接回收问题**

    <!-- 超过时间限制是否回收 -->

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

    <!-- 超时时间;单位为秒。``600``秒=``10``分钟 -->

    <property name=``"removeAbandonedTimeout" value=``"600"``/>    

    需要根据实际情况考虑是否需要开启此属性

    **   (3). 配置了 maxWait 导致的公平锁问题**

    配置了 maxWait 之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置 useUnfairLock 属性为 true 使用非公平锁。

    4.HikariCP 连接池配置

    HiKariCP 是数据库连接池的一个后起之秀,号称性能最好,可以完美地 PK 掉其他连接池,是一个高性能的 JDBC 连接池,基于 BoneCP 做了不少的改进和优化。
    并且在 SpringBoot2.0 之后已经默认将数据库连接池选择为了 HikariCP。

    优势:

    (1)字节码精简

    优化代码,直到编译后的字节码最少,这样,CPU 缓存可以加载更多的程序代码;

    (2)优化代理和拦截器

    减少代码,例如 HikariCP 的 Statement proxy 只有 100 行代码,只有 BoneCP 的十分之一;

    (3)自定义数组类型 (FasttList)代替 ArrayList

    避免每次 get() 调用都要进行 range check, 避免调用 remove() 时的从头到尾的扫描;

    (4)自定义集合类型

    提高并发读写的效率

    配置参数

    https://github.com/brettwooldridge/HikariCP/wiki

    默认配置

    springboot 的 HikariDataSource 默认配置的默认值如下

    name 构造器默认值 默认配置 validate 之后的值 validate 重置
    minIdle -1 10 minIdle<0 或者 minIdle>maxPoolSize, 则被重置为 maxPoolSize
    maxPoolSize -1 10 如果 maxPoolSize 小于 1,则会被重置。当 minIdle<=0 被重置为 DEFAULT_POOL_SIZE 则为 10; 如果 minIdle>0 则重置为 minIdle 的值
    maxLifetime MINUTES.toMillis(30) = 1800000 1800000 如果不等于 0 且小于 30 秒则会被重置回 30 分钟
    connectionTimeout SECONDS.toMillis(30) = 30000 30000 如果小于 250 毫秒,则被重置回 30 秒
    validationTimeout SECONDS.toMillis(5) = 5000 5000 如果小于 250 毫秒,则会被重置回 5 秒
    loginTimeout 10 30 Math.max(1, (int) MILLISECONDS.toSeconds(500L + connectionTimeout)),为 connectionTimeout+500ms 转为秒数取整 与 1 取最大者
    idleTimeout MINUTES.toMillis(10) = 600000 600000 如果 idleTimeout+1 秒 > maxLifetime 且 maxLifetime>0,则会被重置为 0;如果 idleTimeout!=0 且小于 10 秒,则会被重置为 10 秒
    leakDetectionThreshold 0 0 如果大于 0 且不是单元测试,则进一步判断:(leakDetectionThreshold < SECONDS.toMillis(2) or (leakDetectionThreshold > maxLifetime && maxLifetime > 0),会被重置为 0 . 即如果要生效则必须 > 0,而且不能小于 2 秒,而且当 maxLifetime > 0 时不能大于 maxLifetime
    initializationFailTimeout 1 1 -
    isAutoCommit true true -
    isReadOnly false fasle -
    isAllowPoolSuspension false false -
    isIsolateInternalQueries false false -
    isRegisterMbeans false false -
    sealed false true 运行启动后这个标志为 true,表示不再运行修改
    poolName null HikariPool-1 -
    catalog null null -
    connectionInitSql null null -
    connectionTestQuery null null -
    dataSourceClassName null null -
    schema null null -
    transactionIsolationName null null -
    dataSource null null -
    dataSourceProperties {} {} -
    threadFactory null null -
    scheduledExecutor null null -
    metricsTrackerFactory null null -
    metricRegistry null null -
    healthCheckRegistry null null -
    healthCheckProperties {} {} -
  • 相关阅读:
    使用PowerShell脚本来轮训Exchange数据库的状态
    使用NUnit在.Net编程中进行单元测试【转载】
    利用NUnit对类、方法进行原子级测试
    单元测试的重要性
    不用临时变量,只用11个字符交换两个变量的值——窥视C#编译原理的冰山一角
    博客园
    c++的float(NaN)
    mysql之innodb的锁分类
    配置alchemc时cygwin下面,特别要注意路径
    关于异步调用Discuz!NT接口
  • 原文地址:https://www.cnblogs.com/weiguo21/p/12189036.html
Copyright © 2011-2022 走看看