Druid源码分析(总结)

概述

我们为什么需要连接池?

JDBC编程中,每次创建和断开Connection对象都会消耗一定的时间和IO资源。这是因为在Java程序与数据库之间建立连接时,数据库端要验证用户名和密码。
并且要为这个连接分配资源,Java程序则要把代表连接的java.sql.Connection对象等加载到内存中,所以建立数据库连接的开销很大。
尤其是在大量的并发访问时,假如某网站一天的访问量是10万,那么,该网站的服务器就需要创建、断开连接10万次,频繁地创建、断开数据库连接势必会影响数据库的访问效率,甚至导致数据库崩溃。

我们为什么使用Druid?

Druid是现阶段Java中最好的数据库连接池,能够提供强大的监控和扩展功能。

Druid与各类连接池的性能对比(来源官方文档

测试执行申请归还连接1,000,000(一百万)次总耗时性能对比Java 7基准测试结果如下:

JDBC连接池类型1个线程2个线程5个线程10个线程20个线程50个线程
Druid8981,1911,3241,3621,3251,459
tomcat-jdbc1,2691,3782,0292,1031,8792,025
DBCP2,3245,0555,4465,4715,5245,415
BoneCP3,7383,1503,1945,68111,01823,125
jboss-datasource4,3772,9883,6803,98032,70837,742
C3P010,84113,63710,68211,05514,49720,351
Proxool16,33716,18718,310(发生异常)25,94533,706(发生异常)39,501(发生异常)
结论

Druid是性能最好的数据库连接池,tomcat-jdbcdruid性能接近。
proxool在激烈并发时会抛异常,完全不靠谱。
c3p0proxool都相当慢,慢到影响sql执行效率的地步。
bonecp性能并不优越,采用LinkedTransferQueue并没有能够获得性能提升。
jboss-datasource虽然稳定,但是性能很糟糕
该测试基于JDK7,暂无JDK8以上版本测试数据

Druid与各类连接池的功能对比(来源官方文档

DruidBoneCPDBCPC3P0ProxoolJBossTomcat-Jdbc
LRU
PSCache
PSCache-Oracle-Optimized
ExceptionSorter
更新维护
PSCache

PSCache是数据库连接池的关键指标。在Oracle中,类似SELECT NAME FROM USER WHERE ID = ?这样的SQL,启用PSCache和不启用PSCache的性能可能是相差一个数量级的。
Proxool是不支持PSCache的数据库连接池,如果你使用OracleSQL ServerDB2Sybase这样支持游标的数据库,那你就完全不用考虑Proxool

PSCache-Oracle-Optimized

Oracle 10系列的Driver,如果开启PSCache,会占用大量的内存,必须做特别的处理,启用内部的EnterImplicitCache等方法优化才能够减少内存的占用。这个功能只有DruidDataSource有。如果你使用的是Oracle Jdbc,你应该毫不犹豫采用DruidDataSource

ExceptionSorter

ExceptionSorter是一个很重要的容错特性,如果一个连接产生了一个不可恢复的错误,必须立刻从连接池中去掉,否则会连续产生大量错误。这个特性,目前只有JBossDataSourceDruid实现。Druid的实现参考自JBossDataSource,经过长期生产反馈补充。

源码分析版本

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.9</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.9</version>
</dependency>

Druid源码分析

Druid初始化

Druid如何获取连接

Druid如何销毁连接

Druid如何解析SQL

Druid Spring Boot配置项

配置application.yml文件,前缀为spring.datasource.druid
该配置项是基于Druid 1.2.9版本,,具体配置项如下:

推荐配置项

配置项数据类型默认值说明
urlStringnull数据库连接地址
usernameStringnull数据库的连接用户名
passwordStringnull数据库的连接密码
initial-sizeint0初始化时直接创建连接的数量,可预热连接池,使得程序能快速获取连接
max-activeint8最大连接池数量
min-idleint0最小连接池数量
max-waitint-1获取连接时最大等待时间,单位毫秒。
validation-queryStringnull用来检测连接是否有效的SQL,要求是一个查询语句,如果validationQuerynull
testOnBorrowtestOnReturntestWhileIdle都不会起作用。
Myql推荐设置:SELECT 1
Oracle推荐设置:SELECT 1 FROM dual

扩展配置项

注意:版本非1.2.9以上版本,推荐配置testOnReturntestOnBorrowtestWhileIdle这三个参数为以下默认值。

配置项数据类型默认值说明
test-on-returnbooleanfalse归还连接时执行validationQuery检测连接是否有效,比较影响性能,推荐关闭false
test-on-borrowbooleanfalse获取连接时执行validationQuery检测连接是否有效,非常影响性能,推荐关闭false
test-while-idlebooleantrue申请连接的时候判断空闲时间如果大于timeBetweenEvictionRunsMillis
则执行validationQuery检测连接是否有效。
防止因为空闲时间太长,TCP因各种原因断开连接。
推荐开启true
validation-query-timeoutint-1设置执行validationQuery的超时时间

时间关系,先挖坑,后续补充。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值