
Druid 官方参考文档,进行学习
DruidDataSource配置
一、SpringBoot 整合DruidSprintBoot 默认使用的是 HikariDataSource数据源,这次整合一个第三方的数据源 Druid ,它是阿里开发的一款开源的数据源,被很多人认为是Java语言中最好的数据库连接池,因为 Druid 能够提供强大的一整套监控和扩展功能。
1、在创建SpringBoot 的项目,在maven中添加库依赖:
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-jdbc
mysql
mysql-connector-java
runtime
com.alibaba
druid
1.1.11
log4j
log4j
1.2.17
注意:druid 依赖 log4j 的日志jar包,但是 SpringBoot 默认使用的是 slf4j+logback,所以导入log4j的jar包即可。
2、在 application.yml(或aproperties)中添加相应的配置:
server:
port: 80
# 数据库连接信息
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/my_springboot?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT
driver-class-name: com.mysql.cj.jdbc.Driver # com.mysql.jdbc.Driver
# 使用 Druid 数据源
type: com.alibaba.druid.pool.DruidDataSource
log4j.properties 配置文件:
log4j.rootLogger = debug,stdout, D
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.Threshold = INFO
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p %m%n
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = ./log4j.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern=%d %p %m%n
4、在运行测试方法,查看数据源
public class SpringbootdemoApplicationTests {
@Autowired
private DataSource dataSource;
@Autowired
private JdbcTemplate jdbcTemplate;
@Test
public void contextLoads() throws SQLException {
System.out.println("dataSource==" + dataSource.getClass());
Connection connection = dataSource.getConnection();
System.out.println("connection==" + connection);
List maps = jdbcTemplate.queryForList("select * from t_user");
System.out.println(maps);
}
}
Druid 数据源 获取到,那么整合简单完成。
二、Druid 数据源特性配置
第三方的数据源 Druid ,SpirngBoot 默认利用反射的机制配置不能获取druid数据源的信息,需要我们自己做:
1、在全局配置文件中配上Druid 数据源自己的特性配置
1)application.yml
server:
port: 80
# Datasource
# 数据源基本配置
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/my_springboot?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT
driver-class-name: com.mysql.cj.jdbc.Driver # com.mysql.jdbc.Driver
# 使用 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
poolPreparedStatements: true
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,log4j
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
# schema:
# - classpath:department.sql
2)application.properties
server.port=80
# Datasource
# 数据源基本配置
spring.datasource.url=jdbc:mysql://localhost:3306/my_springboot?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # com.mysql.jdbc.Driver
# 使用 Druid 数据源
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
# 数据源其他配置
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
spring.datasource.maxWait=60000
spring.datasource.timeBetweenEvictionRunsMillis=60000
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 1 FROM DUAL
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
spring.datasource.poolPreparedStatements=true
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
spring.datasource.filters=stat,wall,log4j
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
spring.datasource.useGlobalDataSourceStat=true
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
2、创建配置类来注入数据源对象,并获取这些配置到数据源中
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.context.annotation.Configuration;
import javax.sql.DataSource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class DruidConfig {
// 配置绑定
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource druid(){
return new DruidDataSource();
}
// 配置 Druid 的监控
// 1、 配置一个管理后台的Servlet
@Bean
public ServletRegistrationBean statViewServlet(){
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet());
Map initParams = new HashMap();
initParams.put("loginUsername", "admin");
initParams.put("loginPassword", "123456");
initParams.put("allow", "127.0.0.1"); // 空字符串就是允许所有访问,生产环境可以指定ip地址
// initParams.put("deny", "127.0.0.1"); // 指定拒绝某个ip地址访问
bean.setInitParameters(initParams);
bean.setUrlMappings(Arrays.asList(new String[]{"/druid/*"}));
return bean;
}
// 2、配置一个web监控的filter:来实现对整个web应用的所有访问请求进行过滤,从而实现对数据库的访问监控
@Bean
public FilterRegistrationBean webStatFilter(){
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
// 有些不需要拦截的,所以要配置exclusions
Map initParams = new HashMap();
initParams.put("exclusions","*.js,*.css,*.jpg,*.png,/druid/*");
bean.setInitParameters(initParams);
bean.setUrlPatterns(Arrays.asList(new String[]{"/*"}));
return bean;
}
}
3、创建一个Controller,检测下Druid 监控
@Controller
public class IndexController {
@Autowired
private JdbcTemplate jdbcTemplate;
@ResponseBody
@GetMapping("/index")
public String index(Model model){
List maps = jdbcTemplate.queryForList("select * from t_user");
return maps.toString();
}
}
4、启动项目
访问 http://localhost/druid 体验强大的Druid!
访问 http://127.0.0.1/index, 查看下监控
ends ~