java实现的数据库连接池有很多,比如c3p0,dbcp等,还有号称速度最快的HikariCP,并且springboot2.0.2版本默认使用的就是HikariCP。 为什么选用Druid呢? - 性能够好,比c3p0,dbcp强一些 - 经过考验,毕竟是阿里开源出来的项目 - 最关键的是带一个强大的数据库监控
这些特性的加持下足以支撑起我使用Druid的理由。
1、 Druid能监控那些数据

- 数据源
- SQL监控 ,对执行的MySQL语句进行记录,并记录执行时间、事务次数等
- SQL防火墙 ,对SQL进行预编译,并统计该条SQL的数据指标
- Web应用, 对发布的服务进行监控,统计访问次数,并发数等全局信息
- URI监控, 对访问的URI进行统计,记录次数,并发数,执行jdbc数等
- Session监控, 对用户请求后保存在服务器端的session进行记录,识别出每个用户访问了多少次数据库等
- Spring监控 ,(按需配置)利用aop对各个内容接口的执行时间、jdbc数进行记录
2、 如何配置使用Druid
想达到的目标效果,监控sql,监控sql防火墙,监控url,监控session,监控spring 其中监控sql、监控url、基础信息,几乎不怎么需要配置,集成好druid,配置好监控页面,就可以显示。需要我们配置的大概分为3部分,基础连接池配置,基础监控配置,定制化监控配置
2.1 引入Druid的依赖
<!--这里最好引入spring提供的这个starter,在druid-spring-boot-starter这个pom文件中已经引入了源工程的pom文件-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.16</version>
</dependency>
2.2 连接池基础配置
主要配置用户名,密码,数据库驱动、数据库连接.....以及和连接池有关的配置
spring:
datasource:
# 数据源基本配置
username: root
password: 123456
url: jdbc:mysql://localhost:3306/xust?useSSL=false&set global time_zone="+8:00"
driver-class-name: com.mysql.cj.jdbc.Driver
#使用type指定使用Druid
type: com.alibaba.druid.pool.DruidDataSource
# 数据源其他配置
# 初始化连接池的连接数量 大小,最小,最大
initialSize: 5
minIdle: 5
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 是否缓存preparedStatement,也就是PSCache 官方建议MySQL下建议关闭 如果想用SQL防火墙 建议打开
poolPreparedStatements: true
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,log4j
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
# 通过connectProperties属性来打开mergeSql功能
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
2.3 导入Druid数据源的其他属性
上面的配置文件中和数据库连接池有关的配置属性在Spring Boot是没有的,因此我们需要告诉Spring Boot,让他在启动的时候去找加载这些属性,因此我们需要写一个配置类。 没有写配置类之前的效果:

写一个配置类
@Configuration
public class DruidConfig {
//配置Druid的其他属性
@Bean
@ConfigurationProperties(prefix = "spring.datasource") //让Spring boot去加载这些属性,完成对连接池的初始化
public DataSource druid(){
return new DruidDataSource();
}
}
写配置类后的效果,配置类起作用了:

2.4 配置Durid监控
主要就是配置一个后台管理的Servlet—StarViewServlet
和Web监控过滤器—WebStatFilter
。具体有哪些初始化参数可以设置,可以参考这两个类以及他们的父类,都是以常量的方式出现的,配置的时候配置他们的值就可以了。
@Configuration
public class DruidConfig {
//配置Druid数据监控
//1.配置管理后台的Servlet
@Bean
public ServletRegistrationBean statViewServlet(){
ServletRegistrationBean bean=new ServletRegistrationBean(new StatViewServlet(),"/druid/*"); //设置后台管理的路径是/druid/*
Map<String,String> initParams= new HashMap<>();
initParams.put("loginUsername","admin");
initParams.put("loginPassword","123456");
initParams.put("allow",""); //默认就是允许所有访问
initParams.put("deny","192.168.15.21"); //设置不允许访问ip
initParams.put("resetEnable","false"); //是否手动清除监控数据
//设置一些初始化的参数
bean.setInitParameters(initParams);
return bean;
}
//2.配置一个Web监控的Filter
@Bean
public FilterRegistrationBean webStatFilter(){
FilterRegistrationBean bean=new FilterRegistrationBean(new WebStatFilter());
Map<String,String> initParams=new HashMap<>();
initParams.put("exclusions","*.js,*.css,/druid/*");
bean.setInitParameters(initParams);
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
}
写一个controller启动看看效果:
@Controller
public class HelloController {
@Autowired
JdbcTemplate jdbcTemplate;
@ResponseBody
@RequestMapping(value = "/query")
public List<Map<String,Object>> hello(){
List<Map<String, Object>> maps = jdbcTemplate.queryForList("select * from article");
return maps;
}
}
启动后在浏览器地址栏输入localhost:8080/query,执行一次请求启动后在浏览器地址栏输入localhost:8080/druid,可以看到Druid后台管理的登录界面

输入刚刚设置的用户名个密码,来到后台管理页面,点击SQL监控
就可以看到刚才执行的SQL被记录了。

其实主打开箱即用的SpringBoot,对于上面Druid监控的配置其实我们还可以直接在SpringBoot的配置文件中配置,下面是关于Druid监控的配置示例:
debug: true
spring:
datasource:
# Druid监控配置
druid:
stat-view-servlet:
enabled: true #开启后台管理 ,默认也是true
url-pattern: /druid/* #后台管理页面的路径
login-password: 123456
login-username: admin
reset-enable: false #禁止手动清除监控数据
web-stat-filter:
enabled: true
exclusions: .js,.css,.html,/druid/*
url-pattern: /*