Druid数据连接池简介
- Druid是Java语言中最好的数据库连接池。
- Druid能够提供强大的监控和扩展功能。
- 性能好,同时自带监控页面,可以实时监控应用的连接池情况以及其中性能差的sql,方便我们找出应用中连接池方面的问题。
Druid是一个JDBC组件,它包括三部分:
- DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系
- DruidDataSource 高效可管理的数据库连接池
- SQLParser
Druid监控
Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验。
Druid地址:https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter
一、添加依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>
二、编辑配置信息
编辑项目的applicaiton.properties,配置Druid过滤器、WebStatFilter以及StatViewServlet相关参数信息。
#### 数据库配置 ####
spring.datasource.type = com.alibaba.druid.pool.DruidDataSource
spring.datasource.url = jdbc:mysql://localhost:3306/PiaoDB?useUnicode=swater&characterEncoding=UTF-8
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.driver-class-name = com.mysql.jdbc.Driver
##### 连接池配置 #######
# 过滤器设置(第一个stat很重要,没有的话会监控不到SQL)
spring.datasource.druid.filters=stat,wall,log4j2
##### WebStatFilter配置 #######
#启用StatFilter
spring.datasource.druid.web-stat-filter.enabled=true
#添加过滤规则
spring.datasource.druid.web-stat-filter.url-pattern=/*
#排除一些不必要的url
spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*
#开启session统计功能
spring.datasource.druid.web-stat-filter.session-stat-enable=true
#缺省sessionStatMaxCount是1000个
spring.datasource.druid.web-stat-filter.session-stat-max-count=1000
#spring.datasource.druid.web-stat-filter.principal-session-name=
#spring.datasource.druid.web-stat-filter.principal-cookie-name=
#spring.datasource.druid.web-stat-filter.profile-enable=
##### StatViewServlet配置 #######
#启用内置的监控页面
spring.datasource.druid.stat-view-servlet.enabled=true
#内置监控页面的地址
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
#关闭 Reset All 功能
spring.datasource.druid.stat-view-servlet.reset-enable=false
#设置登录用户名
spring.datasource.druid.stat-view-servlet.login-username=admin
#设置登录密码
spring.datasource.druid.stat-view-servlet.login-password=123456
#白名单(如果allow没有配置或者为空,则允许所有访问)
spring.datasource.druid.stat-view-servlet.allow=127.0.0.1
#黑名单(deny优先于allow,如果在deny列表中,就算在allow列表中,也会被拒绝)
spring.datasource.druid.stat-view-servlet.deny=
三、访问监控页面
(1)访问地址:http://127.0.0.1:8082/druid,请求“/druid”接口,这里的用户名和密码就是我们在applicaiton.properties配置的信息。账号:admin,密码:123456
(2)“数据源”子页面里是当前 DataSource 的基本信息统计。注意“filter类名”不能为空,否则会有一些信息无法统计(如“SQL 监控”会无法获取 JDBC 相关的 SQL 执行信息)
四、开启慢sql查询
这里需要注意,监控页面的所有数据都说存储在内存中,重启就没有了,因此制定对应的日志输出策略是极其必要的。
# 开启慢SQL统计(这里超过10毫秒则判定为慢SQL)
spring.datasource.druid.filter.stat.enabled=true
spring.datasource.druid.filter.stat.log-slow-sql=true
spring.datasource.druid.filter.stat.slow-sql-millis=10
slow-sql-millis用来配置SQL慢的标准,执行时间超过slow-sql-millis的就是慢。slow-sql-millis的缺省值为3000,也就是3秒。
我们可以看到只要超过10毫秒的sql就会变红,且会在打印出error日志,我们可以通过日志对慢sql持久化。
五、开启Spring监控
默认情况下监控控制台中“Spring监控”子页面内容是空的,我们可以通过类似如下的配置,利用AOP对各个内容接口的执行时间、jdbc数进行记录。
# Spring 监控配置(配置多个AOP切入点使用英文逗号分隔)
spring.datasource.druid.aop-patterns=com.example.demo.mapper.*
添加spring-boot-starter-aop依赖以提供AOP支持:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
我们可以看到这里记录我们请求的类,方法和执行时间。
六、去除广告
默认情况,监控页面都会有一个阿里的广告。
原理说明:之所以底部有广告,是因为其引入的Druid Jar包的common.js中的内容(里面有一段是在footer添加广告),在RemoveDruidAdConfig配置类中使用过滤器过滤common.js的请求,重新处理后用正则替换相关的广告代码片段。
@Configuration
@ConditionalOnWebApplication
@AutoConfigureAfter(DruidDataSourceAutoConfigure.class)
@ConditionalOnProperty(name = "spring.datasource.druid.stat-view-servlet.enabled",
havingValue = "true", matchIfMissing = true)
public class RemoveDruidAdConfig {
/**
* 方法名: removeDruidAdFilterRegistrationBean
* 方法描述: 除去页面底部的广告
* @param properties
* @return org.springframework.boot.web.servlet.FilterRegistrationBean
* @throws
*/
@Bean
public FilterRegistrationBean removeDruidAdFilterRegistrationBean(DruidStatProperties properties)
{
// 获取web监控页面的参数
DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
// 提取common.js的配置路径
String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*";
String commonJsPattern = pattern.replaceAll("\\*", "js/common.js");
final String filePath = "support/http/resources/js/common.js";
//创建filter进行过滤
Filter filter = new Filter() {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
chain.doFilter(request, response);
// 重置缓冲区,响应头不会被重置
response.resetBuffer();
// 获取common.js
String text = Utils.readFromResource(filePath);
// 正则替换banner, 除去底部的广告信息
text = text.replaceAll("<a.*?banner\"></a><br/>", "");
text = text.replaceAll("powered.*?shrek.wang</a>", "");
response.getWriter().write(text);
}
@Override
public void destroy() {
}
};
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setFilter(filter);
registrationBean.addUrlPatterns(commonJsPattern);
return registrationBean;
}
}
七、获取Druid的监控数据
Druid的监控数据可以在开启StatFilter后通过DruidStatManagerFacade进行获取,获取到监控数据之后我们便可以将其暴露给我们自己的监控系统进行使用。Druid默认的监控系统数据也来源于此。
@RestController
public class DruidStatController {
@GetMapping("/druidStat")
public Object druidStat(){
// DruidStatManagerFacade#getDataSourceStatDataList 该方法可以获取所有数据源的监控数据
// 除此之外 DruidStatManagerFacade 还提供了一些其他方法,我们可以按需选择使用。
return DruidStatManagerFacade.getInstance().getDataSourceStatDataList();
}
}
我们访问地址:http://127.0.0.1:8082/druidStat
这样我们就获得了Druid统计数据了。