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配置
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=laker
#设置登录密码
spring.datasource.druid.stat-view-servlet.login-password=laker
#白名单(如果allow没有配置或者为空,则允许所有访问)
spring.datasource.druid.stat-view-servlet.allow=127.0.0.1
#黑名单(deny优先于allow,如果在deny列表中,就算在allow列表中,也会被拒绝)
spring.datasource.druid.stat-view-servlet.deny=
开启慢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秒
开启Spring监控
默认情况下监控控制台中“Spring监控”子页面内容是空的,我们可以通过类似如下的配置,利用AOP对各个内容接口的执行时间、jdbc数进行记录。
9# Spring 监控配置(配置多个AOP切入点使用英文逗号分隔)
spring.datasource.druid.aop-patterns=com.laker.map.service.,com.laker.map.mapper.
spring:
datasource:
username: root
password: 1113344566
url: jdbc:mysql://xxxxxxx:3306/laker?serverTimezone=GMT%2B8&characterEncoding=utf8&useSSL=false
driver-class-name: com.mysql.cj.jdbc.Driver
druid:
初始连接数
initialSize: 5
最小连接池数量
minIdle: 10
最大连接池数量
maxActive: 20
配置获取连接等待超时的时间
maxWait: 60000
配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
配置检测连接是否有效
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
webStatFilter:
enabled: true
statViewServlet:
enabled: true
设置白名单,不填则允许所有访问
allow:
url-pattern: /druid/*
控制台管理用户名和密码
login-username:
login-password:
filter:
stat:
enabled: true
慢SQL记录
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true
=============================================================================
Druid 的监控数据可以在开启 StatFilter 后通过 DruidStatManagerFacade 进行获取,获取到监控数据之后你可以将其暴露给你的监控系统进行使用。Druid 默认的监控系统数据也来源于此。下面给做一个简单的演示,在 Spring Boot 中如何通过 HTTP 接口将 Druid 监控数据以 JSON 的形式暴露出去,实际使用中你可以根据你的需要自由地对监控数据、暴露方式进行扩展。
@RestController
public class DruidStatController {
@GetMapping(“/druid/stat”)
public Object druidStat(){
// DruidStatManagerFacade#getDataSourceStatDataList 该方法可以获取所有数据源的监控数据,除此之外 DruidStatManagerFacade 还提供了一些其他方法,你可以按需选择使用。
return DruidStatManagerFacade.getInstance().getDataSourceStatDataList();
}
}
[
{
“Identity”: 1583082378,
“Name”: “DataSource-1583082378”,
“DbType”: “h2”,
“DriverClassName”: “org.h2.Driver”,
“URL”: “jdbc:h2:file:./demo-db”,
“UserName”: “sa”,
“FilterClassNames”: [
“com.alibaba.druid.filter.stat.StatFilter”
],
“WaitThreadCount”: 0,
“NotEmptyWaitCount”: 0,
“NotEmptyWaitMillis”: 0,
“PoolingCount”: 2,
“PoolingPeak”: 2,
“PoolingPeakTime”: 1533782955104,
“ActiveCount”: 0,
“ActivePeak”: 1,
“ActivePeakTime”: 1533782955178,
“InitialSize”: 2,
“MinIdle”: 2,
“MaxActive”: 30,
“QueryTimeout”: 0,
“TransactionQueryTimeout”: 0,
“LoginTimeout”: 0,
“ValidConnectionCheckerClassName”: null,
“ExceptionSorterClassName”: null,
“TestOnBorrow”: true,
“TestOnReturn”: true,
“TestWhileIdle”: true,
“DefaultAutoCommit”: true,
“DefaultReadOnly”: null,
“DefaultTransactionIsolation”: null,
“LogicConnectCount”: 103,
“LogicCloseCount”: 103,
“LogicConnectErrorCount”: 0,
“PhysicalConnectCount”: 2,
“PhysicalCloseCount”: 0,
“PhysicalConnectErrorCount”: 0,
“ExecuteCount”: 102,
“ErrorCount”: 0,
“CommitCount”: 100,
“RollbackCount”: 0,
“PSCacheAccessCount”: 100,
“PSCacheHitCount”: 99,
“PSCacheMissCount”: 1,
“StartTransactionCount”: 100,
“TransactionHistogram”: [
55,
44,
1,
0,
0,
0,
0
],
“ConnectionHoldTimeHistogram”: [
53,
47,
3,
0,
0,
0,
0,
0
],
“RemoveAbandoned”: false,
“ClobOpenCount”: 0,
“BlobOpenCount”: 0,
“KeepAliveCheckCount”: 0,
“KeepAlive”: false,
“FailFast”: false,
“MaxWait”: 1234,
“MaxWaitThreadCount”: -1,
“PoolPreparedStatements”: true,
“MaxPoolPreparedStatementPerConnectionSize”: 5,
“MinEvictableIdleTimeMillis”: 30001,
“MaxEvictableIdleTimeMillis”: 25200000,
“LogDifferentThread”: true,
“RecycleErrorCount”: 0,
“PreparedStatementOpenCount”: 1,
“PreparedStatementClosedCount”: 0,
“UseUnfairLock”: true,
“InitGlobalVariants”: false,
“InitVariants”: false
}
]
===================================================================
@Bean
@ConditionalOnProperty(name = “spring.datasource.druid.statViewServlet.enabled”, havingValue = “true”, matchIfMissing = true)
public FilterRegistrationBean removeDruidFilterRegistrationBean(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(javax.servlet.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”>
", “”);
text = text.replaceAll(“powered.*?shrek.wang”, “”);
response.getWriter().write(text);
}
@Override
public void destroy()
{
}
};
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setFilter(filter);
registrationBean.addUrlPatterns(commonJsPattern);
return registrationBean;
}
=============================================================
以上很多配置都可以写在代码中,如下:
/**
- durid 监控页面配置 默认地址 localhost:8080/druid/login.html
*/
@Configuration
@Slf4j
public class DruidConfig {
private static final String DEFAULT_ALLOW_IP = “127.0.0.1”;
/**
-
参见:DruidStatViewServletConfiguration
-
黑白名单
-
登录用户名-密码
-
@param properties
-
@return
*/
@Bean
public ServletRegistrationBean statViewServletRegistrationBean(DruidStatProperties properties) {
log.info(“init statViewServlet Configuration ,properties:{}”, JSONUtil.toJsonPrettyStr(properties));
DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean();
registrationBean.setServlet(new StatViewServlet());
registrationBean.addUrlMappings(config.getUrlPattern() != null ? config.getUrlPattern() : “/druid/*”);
if (config.getAllow() != null) {
registrationBean.addInitParameter(“allow”, config.getAllow());
} else {
registrationBean.addInitParameter(“allow”, DEFAULT_ALLOW_IP);
}
if (config.getDeny() != null) {
registrationBean.addInitParameter(“deny”, config.getDeny());
}
if (config.getLoginUsername() != null) {
registrationBean.addInitParameter(“loginUsername”, config.getLoginUsername());
} else {
// 添加默认用户名 laker
registrationBean.addInitParameter(“loginUsername”, “laker”);
}
if (config.getLoginPassword() != null) {
registrationBean.addInitParameter(“loginPassword”, config.getLoginPassword());
} else {
// 添加默认密码 laker
registrationBean.addInitParameter(“loginPassword”, “laker”);
}
if (config.getResetEnable() != null) {
registrationBean.addInitParameter(“resetEnable”, config.getResetEnable());
}
return registrationBean;
}
/**
-
参见:DruidWebStatFilterConfiguration
-
跳过静态资源
-
@param properties
-
@return
*/
@Bean
public FilterRegistrationBean webStatFilterRegistrationBean(DruidStatProperties properties) {
log.info(“init webStatFilter Configuration ,properties:{}”, JSONUtil.toJsonPrettyStr(properties));
DruidStatProperties.WebStatFilter config = properties.getWebStatFilter();
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
WebStatFilter filter = new WebStatFilter();
registrationBean.setFilter(filter);
registrationBean.addUrlPatterns(config.getUrlPattern() != null ? config.getUrlPattern() : “/*”);
// 跳过静态资源
registrationBean.addInitParameter(“exclusions”, config.getExclusions() != null ? config.getExclusions() : “.js,.gif,.jpg,.png,.css,.ico,/druid/*”);
if (config.getSessionStatEnable() != null) {
registrationBean.addInitParameter(“sessionStatEnable”, config.getSessionStatEnable());
}
if (config.getSessionStatMaxCount() != null) {
registrationBean.addInitParameter(“sessionStatMaxCount”, config.getSessionStatMaxCount());
}
if (config.getPrincipalSessionName() != null) {
registrationBean.addInitParameter(“principalSessionName”, config.getPrincipalSessionName());
}
if (config.getPrincipalCookieName() != null) {
registrationBean.addInitParameter(“principalCookieName”, config.getPrincipalCookieName());
}
if (config.getProfileEnable() != null) {
registrationBean.addInitParameter(“profileEnable”, config.getProfileEnable());
}
return registrationBean;
}
// 参见 DruidFilterConfiguration
@Bean
public StatFilter statFilter() {
return new StatFilter();
}
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
// 参见 DruidFilterConfiguration
@Bean
public StatFilter statFilter() {
return new StatFilter();
}
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-7jyh4iUC-1715236626181)]
[外链图片转存中…(img-qYaamCDm-1715236626182)]
[外链图片转存中…(img-qgZ4wxd4-1715236626182)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!