前言
- 复制黏贴即可使用,经过生产考验。
- 讲清楚配置类 DataSource 是如何使用,StatViewServlet 如何开启监控。
步骤
- 参考博客
- 流程图重点对象描述
- pom 文件。依赖的 jar 包
- application.yml 配置文件。配置了 Druid 的 DataSource
- DataSourceConfig 配置类和 DataSourceConfigProperties 类。配置了 dataSource 、Filters 、StatViewServelt
- Controller 类。测试类。
- SpringBootMain 类。
0. 参考博客
- Druid 参数解释 https://www.cnblogs.com/cymiao/p/8432681.html
- Druid 安全控制 账号密码、ip白名单
- 很好,SpringBoot 三种方式配置 Druid(包括纯配置文件配置)https://www.cnblogs.com/yjq520/p/10779356.html
- Druid 使用手册 https://www.bookstack.cn/read/Druid/2ced3e095b87961f.md
1. 流程图重点对象描述

2. pom 文件。依赖的 jar 包
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jtfr</groupId>
<artifactId>Spring-Druid</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc7</artifactId>
<version>12.1.0.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.6</version>
</dependency>
</dependencies>
</project>
3. application.yml 配置文件。配置了 Druid 的 DataSource、StatViewServlet的账号密码ip
spring:
application:
# 应用名称
name: Spring-Druid
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
driverClassName: oracle.jdbc.OracleDriver
url: jdbc:oracle:xxx
username: username
password: password
initial-size: 10
max-active: 100
min-idle: 10
max-wait: 60000
pool-prepared-statements: true
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
max-evictable-idle-time-millis: 60000
validation-query: SELECT 1 FROM DUAL
# validation-query-timeout: 5000
test-on-borrow: false
test-on-return: false
test-while-idle: true
max-open-prepared-statements: 20
# 耗时监控
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# filters: #配置多个英文逗号分隔(统计stat,sql注入wall,log4j过滤log4j)
filters: stat
# statViewServlet 配置参数
loginUsername: root
loginPassword: root123
resetEnable: false
allow: 127.0.0.1
4. DataSourceConfig 配置类 和 DataSourceConfigProperties 类。配置了 dataSource 、StatViewServelt
package com.jtfr.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import com.jtfr.properties.DataSourceConfigProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableConfigurationProperties(DataSourceConfigProperties.class)
public class DruidConfig {
private static final Logger logger = LoggerFactory.getLogger(DruidConfig.class);
@Value("${spring.datasource.druid.url}")
private String dbUrl;
@Value("${spring.datasource.druid.username}")
private String username;
@Value("${spring.datasource.druid.password}")
private String password;
@Value("${spring.datasource.druid.driverClassName}")
private String driverClassName;
@Value("${spring.datasource.druid.initial-size}")
private int initialSize;
@Value("${spring.datasource.druid.max-active}")
private int maxActive;
@Value("${spring.datasource.druid.min-idle}")
private int minIdle;
@Value("${spring.datasource.druid.max-wait}")
private int maxWait;
@Value("${spring.datasource.druid.pool-prepared-statements}")
private boolean poolPreparedStatements;
@Value("${spring.datasource.druid.time-between-eviction-runs-millis}")
private int timeBetweenEvictionRunsMillis;
@Value("${spring.datasource.druid.min-evictable-idle-time-millis}")
private int minEvictableIdleTimeMillis;
@Value("${spring.datasource.druid.max-evictable-idle-time-millis}")
private int maxEvictableIdleTimeMillis;
@Value("${spring.datasource.druid.validation-query}")
private String validationQuery;
@Value("${spring.datasource.druid.test-while-idle}")
private boolean testWhileIdle;
@Value("${spring.datasource.druid.test-on-borrow}")
private boolean testOnBorrow;
@Value("${spring.datasource.druid.test-on-return}")
private boolean testOnReturn;
@Value("${spring.datasource.druid.filters}")
private String filters;
@Value("{spring.datasource.druid.connection-properties}")
private String connectionProperties;
@Autowired
private DataSourceConfigProperties dataSourceConfigProperties;
@Bean
public DruidDataSource dataSource() {
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl(dbUrl);
datasource.setUsername(username);
datasource.setPassword(password);
datasource.setDriverClassName(driverClassName);
datasource.setInitialSize(initialSize);
datasource.setMinIdle(minIdle);
datasource.setMaxActive(maxActive);
datasource.setMaxWait(maxWait);
datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
datasource.setMaxEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
datasource.setValidationQuery(validationQuery);
datasource.setTestWhileIdle(testWhileIdle);
datasource.setTestOnBorrow(testOnBorrow);
datasource.setTestOnReturn(testOnReturn);
datasource.setPoolPreparedStatements(poolPreparedStatements);
datasource.setPoolPreparedStatements(true);
try {
datasource.setFilters(filters);
} catch (Exception e) {
logger.error("druid configuration initialization filter", e);
}
datasource.setConnectionProperties(connectionProperties);
return datasource;
}
@Bean
public ServletRegistrationBean statViewServlet(){
ServletRegistrationBean servletRegistrationBean =
new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
servletRegistrationBean.addInitParameter("loginUsername", dataSourceConfigProperties.getLoginUsername());
servletRegistrationBean.addInitParameter("loginPassword", dataSourceConfigProperties.getLoginPassword());
servletRegistrationBean.addInitParameter("resetEnable", dataSourceConfigProperties.getResetEnable());
servletRegistrationBean.addInitParameter("allow", dataSourceConfigProperties.getAllow());
return servletRegistrationBean;
}
@Bean
public FilterRegistrationBean statFilter(){
FilterRegistrationBean frb =
new FilterRegistrationBean(new WebStatFilter());
frb.addUrlPatterns("/*");
frb.addInitParameter("exclusions",
"*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return frb;
}
}
package com.jtfr.properties;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties("spring.datasource.druid")
public class DataSourceConfigProperties {
private String loginUsername;
private String loginPassword;
private String resetEnable;
private String allow;
public String getLoginUsername() {
return loginUsername;
}
public void setLoginUsername(String loginUsername) {
this.loginUsername = loginUsername;
}
public String getLoginPassword() {
return loginPassword;
}
public void setLoginPassword(String loginPassword) {
this.loginPassword = loginPassword;
}
public String getResetEnable() {
return resetEnable;
}
public void setResetEnable(String resetEnable) {
this.resetEnable = resetEnable;
}
public String getAllow() {
return allow;
}
public void setAllow(String allow) {
this.allow = allow;
}
}
5. Controller 类。测试类。
package com.jtfr.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("druidController")
public class DruidController {
private static final Logger logger = LoggerFactory.getLogger(DruidController.class);
@Autowired
private JdbcTemplate jdbcTemplate;
@RequestMapping("/test")
public String test (){
String sql = "SELECT COUNT(1) FROM d_phone" ;
Integer countOne = jdbcTemplate.queryForObject(sql,Integer.class) ;
logger.info("countOne=="+countOne);
return "success" ;
}
}
6. SpringBootMain 类。
package com.jtfr;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootMain {
public static void main(String[] args) {
SpringApplication.run(SpringBootMain.class, args);
}
}
7. 思考
- 组件还是自己初始化好一些。比如现在的 Druid 的 dataSource
- application.yml 里面的值 可以任意的取,怎么写 key 都可以
- @Value 不靠谱的时候,使用 @EnableConfigurationProperties 注解提前加载配置文件。