简介
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
主要步骤
- 编写druid.properties,设置数据库连接参数和连接池基本参数等
- 通过DruidDataSourceFactory加载druid.properties文件,并创建DruidDataSource对象
- 通过DruidDataSource对象获得Connection对象
- 使用Connection对象对用户表进行增删改查
创建项目
项目类型Maven Project,打包方式war(其实jar也可以,之所以使用war是为了测试JNDI)。
引入依赖
这里引入日志包,主要为了看看连接池的创建过程,不引入不会有影响的。
编写druid.properties
配置文件路径在resources目录下,因为是入门例子,这里仅给出数据库连接参数和连接池基本参数,后面会对所有配置参数进行详细说明。另外,数据库sql脚本也在该目录下。
当然,我们也可以通过启动参数来进行配置(但这种方式可配置参数会少一些)。
获取连接池和获取连接
项目中编写了JDBCUtil来初始化连接池、获取连接、管理事务和释放资源等,具体参见项目源码。
路径:cn.zzs.druid
编写测试类
这里以保存用户为例,路径在test目录下的cn.zzs.druid。
使用例子-通过JNDI获取数据源
需求
本文测试使用JNDI获取DruidDataSource对象,选择使用tomcat 9.0.21作容器。
如果之前没有接触过JNDI,并不会影响下面例子的理解,其实可以理解为像spring的bean配置和获取。
引入依赖
本文在入门例子的基础上增加以下依赖,因为是web项目,所以打包方式为war:
编写context.xml
在webapp文件下创建目录META-INF,并创建context.xml文件。这里面的每个resource节点都是我们配置的对象,类似于spring的bean节点。其中jdbc/druid-test可以看成是这个bean的id。
注意,这里获取的数据源对象是单例的,如果希望多例,可以设置singleton="false"。
编写web.xml
在web-app节点下配置资源引用,每个resource-ref指向了我们配置好的对象。
编写jsp
因为需要在web环境中使用,如果直接建议写个main方法测试,会一直报错的,目前没找到好的办法。这里就简单地使用jsp来测试吧。
druid提供了DruidDataSourceFactory来支持JNDI。
测试结果
打包项目在tomcat9上运行,访问
http://localhost:8080/druid-demo/testJNDI.jsp ,控制台打印如下内容:
使用例子-开启监控统计
在以上例子基础上修改。
配置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缩写,我们看MergeStatFilter的实现: