从零搭建开发脚手架 集成Druid连接池并开启其自带监控

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.

配置示例(yaml)


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 的监控数据(Json)

=============================================================================

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开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值