通过源码告诉你阿里的数据库连接池Druid有多牛

本文详细介绍了阿里巴巴的数据库连接池Druid的使用,包括配置、监控、防御SQL注入等功能。通过实例展示了如何创建DruidDataSource,使用JNDI获取数据源,以及开启监控统计和SQL过滤。此外,文章还探讨了Druid的源码,分析了其初始化过程和连接获取流程。
摘要由CSDN通过智能技术生成

简介

druid是用于创建和管理连接,利用“池”的方式复用连接减少资源开销,和其他数据源一样,也具有连接数控制、连接可靠性测试、连接泄露控制、缓存语句等功能,另外,druid还扩展了监控统计、防御SQL注入等功能。

使用例子-入门

需求

使用druid连接池获取连接对象,对用户数据进行简单的增删改查(sql脚本项目中已提供)。

工程环境

JDK:1.8.0_231

maven:3.6.1

IDE:eclipse 4.12

mysql-connector-java:8.0.15

mysql:5.7 .28

druid:1.1.20

主要步骤

  1. 编写druid.properties,设置数据库连接参数和连接池基本参数等
  2. 通过DruidDataSourceFactory加载druid.properties文件,并创建DruidDataSource对象
  3. 通过DruidDataSource对象获得Connection对象
  4. 使用Connection对象对用户表进行增删改查

创建项目

项目类型Maven Project,打包方式war(其实jar也可以,之所以使用war是为了测试JNDI)。

引入依赖

这里引入日志包,主要为了看看连接池的创建过程,不引入不会有影响的。

简直了!通过源码告诉你阿里的数据库连接池Druid为啥如此牛逼

 

编写druid.properties

配置文件路径在resources目录下,因为是入门例子,这里仅给出数据库连接参数和连接池基本参数,后面会对所有配置参数进行详细说明。另外,数据库sql脚本也在该目录下。

当然,我们也可以通过启动参数来进行配置(但这种方式可配置参数会少一些)。

简直了!通过源码告诉你阿里的数据库连接池Druid为啥如此牛逼

 

获取连接池和获取连接

项目中编写了JDBCUtil来初始化连接池、获取连接、管理事务和释放资源等,具体参见项目源码。

路径:cn.zzs.druid

简直了!通过源码告诉你阿里的数据库连接池Druid为啥如此牛逼

 

编写测试类

这里以保存用户为例,路径在test目录下的cn.zzs.druid。

简直了!通过源码告诉你阿里的数据库连接池Druid为啥如此牛逼

 

使用例子-通过JNDI获取数据源

需求

本文测试使用JNDI获取DruidDataSource对象,选择使用tomcat 9.0.21作容器。

如果之前没有接触过JNDI,并不会影响下面例子的理解,其实可以理解为像spring的bean配置和获取。

引入依赖

本文在入门例子的基础上增加以下依赖,因为是web项目,所以打包方式为war:

简直了!通过源码告诉你阿里的数据库连接池Druid为啥如此牛逼

 

编写context.xml

在webapp文件下创建目录META-INF,并创建context.xml文件。这里面的每个resource节点都是我们配置的对象,类似于spring的bean节点。其中jdbc/druid-test可以看成是这个bean的id。

注意,这里获取的数据源对象是单例的,如果希望多例,可以设置singleton="false"。

简直了!通过源码告诉你阿里的数据库连接池Druid为啥如此牛逼

 

编写web.xml

在web-app节点下配置资源引用,每个resource-ref指向了我们配置好的对象。

简直了!通过源码告诉你阿里的数据库连接池Druid为啥如此牛逼

 

编写jsp

因为需要在web环境中使用,如果直接建议写个main方法测试,会一直报错的,目前没找到好的办法。这里就简单地使用jsp来测试吧。

druid提供了DruidDataSourceFactory来支持JNDI。

简直了!通过源码告诉你阿里的数据库连接池Druid为啥如此牛逼

 

测试结果

打包项目在tomcat9上运行,访问 http://localhost:8080/druid-demo/testJNDI.jsp ,控制台打印如下内容:

简直了!通过源码告诉你阿里的数据库连接池Druid为啥如此牛逼

 

使用例子-开启监控统计

在以上例子基础上修改。

配置StatFilter

打开监控统计功能

druid的监控统计功能是通过filter-chain扩展实现,如果你要打开监控统计功能,配置StatFilter,如下:

filters=stat

stat是com.alibaba.druid.filter.stat.StatFilter的别名,别名映射配置信息保存在druid-xxx.jar!/META-INF/druid-filter.properties。

SQL合并配置

当你程序中存在没有参数化的sql执行时,sql统计的效果会不好。比如:

select * from t where id = 1
select * from t where id = 2
select * from t where id = 3

在统计中,显示为3条sql,这不是我们希望要的效果。StatFilter提供合并的功能,能够将这3个SQL合并为如下的SQL:

select * from t where id = ?

可以配置StatFilter的mergeSql属性来解决:

#用于设置filter的属性
#多个参数用";"隔开
connectionProperties=druid.stat.mergeSql=true

StatFilter支持一种简化配置方式,和上面的配置等同的。如下:

filters=mergeStat

mergeStat是的MergeStatFilter缩写,我们看MergeS

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值