Druid是阿里巴巴开源平台上一个数据库连接池实现,结合了C3P0、DBCP等的优点,同时加入了日志、SQL监控等功能,本篇记录Springboot和Druid的整合。
Druid可以做什么?
可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。
数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver 和 DruidDataSource 都支持 PasswordCallback。
SQL执行日志,Druid 提供了不同的 LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。
Druid的使用
- 导入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.23</version>
</dependency>
- 配置文件
spring:
datasource:
username:
password:
url:
driver-class-name: com.mysql.jdbc.Driver
#指定数据源
type: com.alibaba.druid.pool.DruidDataSource
#druid 数据源专有配置:Spring Boot 默认是不注入这些属性值的,需要自己绑定
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
#配置监控统计拦截的filters,stat:监控统计、logback:日志记录、wall:防御sql注入
#如果允许时报错 java.lang.ClassNotFoundException: org.apache.log4j.Priority
filters: stat,wall,logback
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
- 绑定配置文件、启动日志监控
Spring Boot默认不会注入Druid的专有属性,因此需要是使用者将其添加到容器中。
package com.strtz3.blog.component.custom;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import javax.sql.DataSource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
@Component
public class DruidConfig {
/**
* 加载配置
*
* @return
*/
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return new DruidDataSource();
}
/**
* 后台监控日志
*/
@Bean
public ServletRegistrationBean statViewServlet() {
//访问路径
ServletRegistrationBean<StatViewServlet> servletBean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
HashMap map = new HashMap();
map.put("loginUsername", "admin");
map.put("loginPassword", "admin");
map.put("allow", ""); //允许访问,空为所有人
//map.put("someone","192.168.111.11"); //黑名单
servletBean.setInitParameters(map);
return servletBean;
}
/**
* 日志拦截过滤
*
* @return
*/
@Bean
public FilterRegistrationBean webStatFilter() {
FilterRegistrationBean bean = new FilterRegistrationBean();
//WebStatFilter:用于配置Web和Druid数据源之间的管理关联监控统计
bean.setFilter(new WebStatFilter());
//exclusions:设置哪些请求进行过滤排除掉,从而不进行统计
Map<String, String> initParams = new HashMap<>();
initParams.put("exclusions", "*.js,*.css,/druid/*");
bean.setInitParameters(initParams);
//"/*" 表示过滤所有请求
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
}
[图片上传失败...(image-c8144-1598108218344)]