由于最近需要使用到druid的监控功能,所以做个总结来验证下自己最近获取到的知识学得怎么样。
项目结构
springboot引入druid需要使用的依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>true</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
我项目采用的是application.yml结构
spring:
datasource:
name: druidDataSource
#配置DruidDatasouce连接池
type: com.alibaba.druid.pool.DruidDataSource
druid:
#连接数据库
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql:///test
username: root
password: web2017
#druid配置详情信息
max-active: 100 #最大连接数
initial-size: 1 #初始化连接数
max-wait: 60000 #获取最大等待时间
min-idle: 1 #最小连接数
validation-query: select 'x' #
time-between-eviction-runs-millis: 60000 #一个连接在池中最小生存的时间,单位是毫秒
min-evictable-idle-time-millis: 300000 #间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
pool-prepared-statements: false #是否缓存preparedStatement 在mysql的环境下建议关闭 因为对数据库性能消耗大
max-open-prepared-statements: 50
max-pool-prepared-statement-per-connection-size: 20
filters: stat,wall #配置监控统计拦截的filters,去掉后监控界面SQL无法进行统计,'wall'用于防火墙
配置Druid的的配置文件类 ,我这里把Druid的配置信息封装成了一个Properties的配置文件对象,方便修改和使用
//此注解会加载配置文件中的spring.datasource.druid的配置文件前缀从而获取到与前缀相关的配置信息
@ConfigurationProperties(prefix = "spring.datasource.druid")
@Getter
@Setter
public class DruidDataSourceProperties {
private String driverClassName;
private String url;
private String username;
private String password;
private int maxActive;
private int initialSize;
private int maxWait;
private int minIdle;
private String validationQuery;
private String filters;
private long timeBetweenEvictionRunsMillis;
private long minEvictableIdleTimeMillis;
private Boolean poolPreparedStatements;
private int maxOpenPreparedStatements;
private int maxPoolPreparedStatementPerConnectionSize;
}
现在开始配置Druid的配置类
方式一:基于配置类的形式
//Configuration定义这个类是一个配置类 用来配置Druid的相关信息的嘞
@Configuration
/**
* EnableConfigurationProperties注解作用是使得ConfigurationProperties注解生效,
* 如果我们在类上面只配置了ConfigurationProperties 在IOC的容器中是获取不到Properties配置文件转化的Bean的
*/
@EnableConfigurationProperties(DruidDataSourceProperties.class)
public class DruidConfig {
@Autowired
private DruidDataSourceProperties properties;
@Bean
@ConditionalOnMissingBean
public DataSource druidDataSource() {
DruidDataSource druidDataSource;
try {
//将我们自己定义的配置信息注入的DruidDataSource的对象中
druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName(properties.getDriverClassName());
druidDataSource.setUrl(properties.getUrl());
druidDataSource.setUsername(properties.getUsername());
druidDataSource.setPassword(properties.getPassword());
druidDataSource.setMaxActive(properties.getMaxActive());
druidDataSource.setInitialSize(properties.getInitialSize());
druidDataSource.setMaxWait(properties.getMaxWait());
druidDataSource.setMinIdle(properties.getMinIdle());
druidDataSource.setValidationQuery(properties.getValidationQuery());
druidDataSource.setFilters(properties.getFilters());
druidDataSource.setTimeBetweenEvictionRunsMillis(properties.getTimeBetweenEvictionRunsMillis());
druidDataSource.setMinEvictableIdleTimeMillis(properties.getMinEvictableIdleTimeMillis());
druidDataSource.setPoolPreparedStatements(properties.getPoolPreparedStatements());
druidDataSource.setMaxPoolPreparedStatementPerConnectionSize(properties.getMaxPoolPreparedStatementPerConnectionSize());
druidDataSource.setMaxOpenPreparedStatements(properties.getMaxOpenPreparedStatements());
druidDataSource.init();
return druidDataSource;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
/**
* 配置监控视图信息
*
* @return
*/
@Bean
//改注解表示如果存在修改的类的Bean 则不需要创建这个bean
@ConditionalOnMissingBean
public ServletRegistrationBean druidServlet() {
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
//下面这个allow属性你填写你允许的登录的ip地址
servletRegistrationBean.addInitParameter("allow", "192.168.10.101");
//IP地址黑名单 根据官方配置信息 deny会优于allow
servletRegistrationBean.addInitParameter("deny", "192.168.18.108");
//登录druid后台监控的账号密码
servletRegistrationBean.addInitParameter("loginUsername", "root");
servletRegistrationBean.addInitParameter("loginPassword", "root");
//是否能够重置数据
servletRegistrationBean.addInitParameter("resetEnable", "true");
return servletRegistrationBean;
}
/**
* 配置监控拦截器
*
* @return
*/
@Bean
@ConditionalOnMissingBean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new WebStatFilter());
//拦截的路径
filterRegistrationBean.addUrlPatterns("/*");
//不需要拦截的信息
filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
}
上述的内容是Druid配置文件是基于配置类的信息,下面是基于配置注解方式实现
方法二:基于注解方式
//配置Druid监控的拦截器
@WebFilter(filterName = "druidWebStatFilter", urlPatterns = "/*",
initParams = {
@WebInitParam(name = "exclusions", value = "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*")// 忽略资源
})
public class DruidStatFilter extends WebStatFilter {
}
//配置监控视图信息
@WebServlet(urlPatterns = "/druid/*",
initParams = {
@WebInitParam(name = "allow", value = "192.168.10.101,127.0.0.1"),// IP白名单 (没有配置或者为空,则允许所有访问)
@WebInitParam(name = "deny", value = "192.168.18.108"),// IP黑名单 (存在共同时,deny优先于allow)
@WebInitParam(name = "loginUsername", value = "root"),// 用户名
@WebInitParam(name = "loginPassword", value = "root"),// 密码
@WebInitParam(name = "resetEnable", value = "false")// 禁用HTML页面上的“Reset All”功能
})
public class DruidStatViewServlet extends StatViewFilter {
}
配置上面两个类之后 我们在Druid配置类中只需要配置把我们的属性注入进DruidDataSource中就可以了
//Configuration定义这个类是一个配置类 用来配置Druid的相关信息的嘞
@Configuration
/**
* EnableConfigurationProperties注解作用是使得ConfigurationProperties注解生效,
* 如果我们在类上面只配置了ConfigurationProperties 在IOC的容器中是获取不到Properties配置文件转化的Bean的
*/
@EnableConfigurationProperties(DruidDataSourceProperties.class)
public class DruidConfig {
@Autowired
private DruidDataSourceProperties properties;
@Bean
@ConditionalOnMissingBean
public DataSource druidDataSource() {
DruidDataSource druidDataSource;
try {
//将我们自己定义的配置信息注入的DruidDataSource的对象中
druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName(properties.getDriverClassName());
druidDataSource.setUrl(properties.getUrl());
druidDataSource.setUsername(properties.getUsername());
druidDataSource.setPassword(properties.getPassword());
druidDataSource.setMaxActive(properties.getMaxActive());
druidDataSource.setInitialSize(properties.getInitialSize());
druidDataSource.setMaxWait(properties.getMaxWait());
druidDataSource.setMinIdle(properties.getMinIdle());
druidDataSource.setValidationQuery(properties.getValidationQuery());
druidDataSource.setFilters(properties.getFilters());
druidDataSource.setTimeBetweenEvictionRunsMillis(properties.getTimeBetweenEvictionRunsMillis());
druidDataSource.setMinEvictableIdleTimeMillis(properties.getMinEvictableIdleTimeMillis());
druidDataSource.setPoolPreparedStatements(properties.getPoolPreparedStatements());
druidDataSource.setMaxPoolPreparedStatementPerConnectionSize(properties.getMaxPoolPreparedStatementPerConnectionSize());
druidDataSource.setMaxOpenPreparedStatements(properties.getMaxOpenPreparedStatements());
druidDataSource.init();
return druidDataSource;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
最后你登录
http://你的IP:你的端口号/druid/index.html 查看你的Druid监控信息
参考文献:
Druid连接池的testQuery/validationQuery https://blog.csdn.net/sjtu_chenchen/article/details/77618967
SpringBoot自动化配置原理 https://blog.csdn.net/jeffleo/article/details/77173551