Druid是阿里巴巴开发的数据库连接池,是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池。
它包括三个部分:
基于Filter-Chain模式的插件体系
DruidDataSource 高效可管理的数据库连接池
SQLParser
Druid的功能:
替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池
可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助
数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback
SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况
扩展JDBC,如果你要对JDBC层有编程的需求,可以通过Druid提供的Filter机制,很方便编写JDBC层的扩展插件
官方地址:
链接: Druid官方Github地址
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druidartifactId>
<version>1.1.17version>
dependency>
spring:
datasource:
url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8
username: root
password: admin
driver-class-name: com.mysql.jdbc.Driver
配置自定义数据源
package com.gavin.boot.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
import java.sql.SQLException;
/**
* 自定义数据源
*/
@Configuration
public class MyDataSource {
/**
* 配置数据源
* @return
*/
@ConfigurationProperties("spring.datasource")
@Bean
public DataSource dataSource() throws SQLException {
DruidDataSource druidDataSource = new DruidDataSource();
//加入监控功能
druidDataSource.setFilters("stat,wall");
return druidDataSource;
}
}
测试
package com.gavin.boot;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import javax.sql.DataSource;
@Slf4j
@SpringBootTest
class BootJdbcApplicationTests {
@Autowired
DataSource dataSource;
@Test
void contextLoads() {
log.info("数据源为:" + dataSource.getClass());
}
}
测试结果为:
可以看出将DataSource数据源更换为Druid数据源了,这里提一下springboot默认的数据源是Hikari
先修改自定义配置类
package com.gavin.boot.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import org.springframework.boot.context.properties.ConfigurationProperties;
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.sql.SQLException;
/**
* 自定义数据源
*/
@Configuration
public class MyDataSource {
/**
* 配置数据源
* @return
*/
@ConfigurationProperties("spring.datasource")
@Bean
public DataSource dataSource() throws SQLException {
DruidDataSource druidDataSource = new DruidDataSource();
//加入监控功能
druidDataSource.setFilters("stat");
return druidDataSource;
}
/**
* 配置druid的监控功能
* @return
*/
@Bean
public ServletRegistrationBean statViewServlet() {
StatViewServlet statViewServlet = new StatViewServlet();
ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*");
return registrationBean;
}
}
再写一个访问数据库的controller类
package com.gavin.boot.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class IndexController {
@Autowired
private JdbcTemplate jdbcTemplate;
@GetMapping("/sql")
@ResponseBody
public Long queryForObject() {
Long aLong = jdbcTemplate.queryForObject("select count(*) from sys_user", Long.class);
return aLong;
}
}
重启服务测试:
先访问Druid页面
地址:http://localhost:8080/druid
可以看出SQL监控中没有执行过SQL
接下访问IndexController 中的/sql接口,去访问数据库
地址:http://localhost:8080/sql
访问结果:
再返回Druid页面查看SQL监控
可以看出刚才访问接口的记录在SQL监控中可以看到
修该配置类,在druidDataSource.setFilters()方法中添加参数值wall
package com.gavin.boot.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import org.springframework.boot.context.properties.ConfigurationProperties;
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.sql.SQLException;
/**
* 自定义数据源
*/
@Configuration
public class MyDataSource {
/**
* 配置数据源
* @return
*/
@ConfigurationProperties("spring.datasource")
@Bean
public DataSource dataSource() throws SQLException {
DruidDataSource druidDataSource = new DruidDataSource();
//加入监控功能
druidDataSource.setFilters("stat,wall");
return druidDataSource;
}
/**
* 配置druid的监控功能
* @return
*/
@Bean
public ServletRegistrationBean statViewServlet() {
StatViewServlet statViewServlet = new StatViewServlet();
ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*");
return registrationBean;
}
}
重启服务测试:
访问/sql接口
再访问Druid页面,点击SQL防火墙
可以在SQL防火墙中看到刚才访问接口的信息
修改配置类,注入FilterRegistrationBean
package com.gavin.boot.config;
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.sql.Array;
import java.sql.SQLException;
import java.util.Arrays;
/**
* 自定义数据源
*/
@Configuration
public class MyDataSource {
/**
* 配置数据源
* @return
*/
@ConfigurationProperties("spring.datasource")
@Bean
public DataSource dataSource() throws SQLException {
DruidDataSource druidDataSource = new DruidDataSource();
//加入监控功能
druidDataSource.setFilters("stat,wall");
return druidDataSource;
}
/**
* 配置druid的监控功能
* @return
*/
@Bean
public ServletRegistrationBean statViewServlet() {
StatViewServlet statViewServlet = new StatViewServlet();
ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*");
return registrationBean;
}
/**
* 配置WebStatFilter
* @return
*/
@Bean
public FilterRegistrationBean webStatFilter() {
WebStatFilter webStatFilter = new WebStatFilter();
FilterRegistrationBean<WebStatFilter> registrationBean = new FilterRegistrationBean<>(webStatFilter);
registrationBean.setUrlPatterns(Arrays.asList("/*"));
registrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return registrationBean;
}
}
重启服务测试:
访问/sql接口
再访问Druid页面,点击web应用
可以看到接口访问信息
在访问Druid页面时,我们可以增加登录验证,输入正确的用户名密码后才能访问页面
实现方法:设置registrationBean.addInitParameter()和registrationBean.addInitParameter()这两个参数即可
package com.gavin.boot.config;
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.sql.Array;
import java.sql.SQLException;
import java.util.Arrays;
/**
* 自定义数据源
*/
@Configuration
public class MyDataSource {
/**
* 配置数据源
* @return
*/
@ConfigurationProperties("spring.datasource")
@Bean
public DataSource dataSource() throws SQLException {
DruidDataSource druidDataSource = new DruidDataSource();
//加入监控功能
druidDataSource.setFilters("stat,wall");
return druidDataSource;
}
/**
* 配置druid的监控功能
* @return
*/
@Bean
public ServletRegistrationBean statViewServlet() {
StatViewServlet statViewServlet = new StatViewServlet();
ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*");
registrationBean.addInitParameter("loginUsername", "admin");
registrationBean.addInitParameter("loginPassword", "123456");
return registrationBean;
}
/**
* 配置WebStatFilter
* @return
*/
@Bean
public FilterRegistrationBean webStatFilter() {
WebStatFilter webStatFilter = new WebStatFilter();
FilterRegistrationBean<WebStatFilter> registrationBean = new FilterRegistrationBean<>(webStatFilter);
registrationBean.setUrlPatterns(Arrays.asList("/*"));
registrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return registrationBean;
}
}
重启服务测试:
直接访问Druid页面
输入正确的用户名密码后就可以访问了
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druid-spring-boot-starterartifactId>
<version>1.1.17version>
dependency>
分析源码从DruidDataSourceAutoConfigure这个类作为入口,往下面去看
主要看下面这几个核心的类
简单说下这几个类的作用,有兴趣的话自己可以研究下
直接在application.yml配置文件里面配置就可以使用了
参考配置如下:
spring:
datasource:
url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8
username: root
password: admin
driver-class-name: com.mysql.jdbc.Driver
druid:
aop-patterns: com.atguigu.admin.* #监控SpringBean
filters: stat,wall # 底层开启功能,stat(sql监控),wall(防火墙)
stat-view-servlet: # 配置监控页功能
enabled: true
login-username: admin
login-password: admin
resetEnable: false
web-stat-filter: # 监控web
enabled: true
urlPattern: /*
exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
filter:
stat: # 对上面filters里面的stat的详细配置
slow-sql-millis: 1000
logSlowSql: true
enabled: true
wall:
enabled: true
config:
drop-table-allow: false
和之前一样,直接访问:http://localhost:8080/druid
输入用户名密码登录成功后,可以访问到Druid首页
以上就是Druid连接池的基本用法,以后了解到其它新的功能后再更新吧。