1、Druid 是什么
Druid 是一个 JDBC 组件,包括三部分:
- DruidDriver 代理 Driver,能够提供基于 Filter - Chain 模式的插件体系
- DruidDataSource 高效可管理的数据库连接池
- SQLParser
Druid 官网:https://druid.apache.org/
官方下载:https://github.com/alibaba/druid
官方文档:https://druid.apache.org/docs/latest/design/index.html
2、Druid 的作用
- 可以监控数据库访问性能,内置提供了一个 StatFilter 插件,能够详细统计 SQL 的执行性能,对线上分析数据库访问性能有帮助。
- 替换 DBCP 和 C3P0,Druid 提供了一个高效,功能强大,可扩展性好的数据库连接池
- SQL 执行日志,提供了不同的 LogFilter,支持 Common-Logging、Log4j 和 JdkLog
2、导入 maven 依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.22</version>
</dependency>
3、DruidDataSource 配置
Druid 配置:https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE
spring:
datasource:
# 基本属性
username: username
password: password
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
# 连接池属性
druid:
# 配置初始化大小,最大,最小
initial-size: 1
max-active: 20
min-idle: 1
# 连接等待超时时间
max-wait: 6000
# 多久进行一次检测,检测需要关闭的空闲连接,单位是毫秒
time-between-eviction-runs-millis: 60000
# 在连接池中最小的生存的时间,单位是毫秒
min-evictable-idle-time-millis: 300000
test-while-idle: true
test-on-borrow: false
test-on-return: false
pool-prepared-statements: true
max-open-prepared-statements: 20
keep-alive: true
async-init: true
phy-max-use-count: 500
# 监控器拦截的 filters
filters: stat
4、Druid Servlet 配置
web.xml 配置
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
<!-- 配置 Druid 监控信息显示页面 -->
<init-param>
<!-- 允许清空统计数据 -->
<param-name>resetEnable</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<!-- 用户名 -->
<param-name>loginUsername</param-name>
<param-value>username</param-value>
</init-param>
<init-param>
<!-- 密码 -->
<param-name>loginPassword</param-name>
<param-value>password</param-value>
</init-param>
<!-- 访问控制
deny 优先于allow
allow 没有配置或者为空,允许所有访问,不支持 IPV6
-->
<init-param>
<param-name>allow</param-name>
<param-value>128.242.127.1/24,128.242.128.1</param-value>
</init-param>
<init-param>
<param-name>deny</param-name>
<param-value>128.242.127.4</param-value>
</init-param>
<!-- 配置 resetEnable,允许清空统计数据 -->
<init-param>
<param-name>resetEnable</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DruidStatView</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping>
SpringBoot 配置
@Configuration
public class DruidConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource druidDataSource(){
return new DruidDataSource();
}
// Druid 后台监控
// SpringBoot 内置 Servlet 容器,没有 web.xml,替代方式:ServletRegistrationBean
@Bean
public ServletRegistrationBean servletRegistrationBean(){
ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
// 后台登录,账号密码设置
HashMap<String, String> map = new HashMap<>();
// 增加配置,key 为固定值
map.put("loginUsername", "username");
map.put("loginPassword", "password");
// 允许谁访问,为空代表所有人可以访问
map.put("allow", "");
// 禁止访问地址
map.put("name", "IP");
bean.setInitParameters(map);
return bean;
}
// 过滤器
@Bean
public FilterRegistrationBean filterRegistrationBean(){
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
HashMap<String, String> map = new HashMap<>();
// 过滤路径
bean.addUrlPatterns("/*");
// 忽略过滤的形式
map.put("exclusions", "*.js,*.css,*.png,*.gif,*.ico,/druid/*");
// 过滤的请求
bean.setInitParameters(map);
return bean;
}
}
5、访问 Druid 后台
http://localhost:8080/druid/login.html