SpringBoot + Druid DataSource 实现监控 MySQL 性能

点击关注公众号,Java干货及时送达👇

2539a0acc0bd255d415a4bedd7d5388b.png来源:blog.csdn.net/lvoelife/article/details/128092586

1. 基本概念

我们都使用过连接池,比如C3P0,DBCP,hikari, Druid,虽然HikariCP的速度稍快,但Druid能够提供强大的监控和扩展功能,也是阿里巴巴的开源项目。

Druid是阿里巴巴开发的号称为监控而生的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource等等,秒杀一切。

Druid可以很好的监控DB池连接和SQL的执行情况,天生就是针对监控而生的DB连接池。

Spring Boot默认数据源HikariDataSourceJdbcTemplate中已经介绍Spring Boot 2.x默认使用Hikari数据源,可以说Hikari与Driud都是当前Java Web上最优秀的数据源。

而Druid已经在阿里巴巴部署了超过600个应用,经过好几年生产环境大规模部署的严苛考验!

  • stat: Druid内置提供一个StatFilter,用于统计监控信息。

  • wall: Druid防御SQL注入攻击的WallFilter就是通过Druid的SQL Parser分析。Druid提供的SQL Parser可以在JDBC层拦截SQL做相应处理,比如说分库分表、审计等。

  • log4j2: 这个就是 日志记录的功能,可以把sql语句打印到log4j2供排查问题。

2. 相关配置

2.1 添加依赖

<properties><java.version>1.8</java.version><alibabaDruidStarter.version>1.2.11</alibabaDruidStarter.version>
</properties><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>${alibabaDruidStarter.version}</version>
</dependency>

2.2 配置属性

  • 配置Druid数据源(连接池): 如同c3p0、dbcp数据源可以设置数据源连接初始化大小、最大连接数、等待时间、最小连接数 等一样,Druid数据源同理可以进行设置。

  • 配置Druid web监控filter(WebStatFilter): 这个过滤器的作用就是统计web应用请求中所有的数据库信息,比如 发出的sql语句,sql执行的时间、请求次数、请求的url地址、以及seesion监控、数据库表的访问次数等等。

  • 配置Druid后台管理Servlet(StatViewServlet): Druid数据源具有监控的功能,并提供了一个web界面方便用户查看,类似安装 路由器 时,人家也提供了一个默认的web页面;需要设置Druid的后台管理页面的属性,比如 登录账号、密码等。

【注意】:Druid Spring Boot Starter配置属性的名称完全遵照Druid,可以通过Spring Boot配置文件来配置Druid数据库连接池和监控,如果没有配置则使用默认值,如下在application.yml配置相关属性:

# spring 配置
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverpassword: 123456username: rooturl: jdbc:mysql://localhost:3306/superjson?useUnicode=true&characterEncoding=utf8&useSSL=false# 连接池配置druid:# 初始化大小,最小,最大initial-size: 5min-idle: 5max-active: 20# 配置获取连接等待超时的时间max-wait: 60000# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位毫秒time-between-eviction-runs-millis: 60000# 配置一个连接在池中最小生存时间min-evictable-idle-time-millis: 300000validation-query: SELECT 1 FROM usertest-while-idle: truetest-on-borrow: falsetest-on-return: false# 打开 PSCache,并且指定每个连接上 PSCache 的大小pool-prepared-statements: truemax-pool-prepared-statement-per-connection-size: 20# 配置监控统计拦截的 Filter,去掉后监控界面 SQL 无法统计,wall 用于防火墙filters: stat,wall,slf4j# 通过 connection-properties 属性打开 mergeSql 功能;慢 SQL 记录connection-properties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000# 配置 DruidStatFilterweb-stat-filter:enabled: trueurl-pattern: /*exclusions: .js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*# 配置 DruidStatViewServletstat-view-servlet:url-pattern: /druid/*# IP 白名单,没有配置或者为空,则允许所有访问allow: 127.0.0.1# IP 黑名单,若白名单也存在,则优先使用deny: 192.168.31.253# 禁用 HTML 中 Reset All 按钮reset-enable: false# 登录用户名/密码login-username: rootlogin-password: 123456# 需要设置enabled=true,否则会报出There was an unexpected error (type=Not Found, status=404).错误,或者将druid-spring-boot-starter的版本降低到1.1.10及以下# 是否启用StatViewServlet(监控页面)默认值为false(考虑到安全问题默认并未启动,如需启用建议设置密码或白名单以保障安全)enabled: true

上述配置文件的参数可以在com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatPropertiesorg.springframework.boot.autoconfigure.jdbc.DataSourcePropertie中找到。

2.3 配置Filter

可以通过spring.datasource.druid.filters=stat,wall,log4j ...的方式来启用相应的内置Filter,不过这些Filter都是默认配置。如果默认配置不能满足需求,可以放弃这种方式,通过配置文件来配置Filter,如下所示:

# 配置StatFilter 
spring.datasource.druid.filter.stat.enabled=true
spring.datasource.druid.filter.stat.db-type=h2
spring.datasource.druid.filter.stat.log-slow-sql=true
spring.datasource.druid.filter.stat.slow-sql-millis=2000# 配置WallFilter 
spring.datasource.druid.filter.wall.enabled=true
spring.datasource.druid.filter.wall.db-type=h2
spring.datasource.druid.filter.wall.config.delete-allow=false
spring.datasource.druid.filter.wall.config.drop-table-allow=false

目前为以下Filter提供了配置支持,根据(spring.datasource.druid.filter.*)进行配置。

  • StatFilter

  • WallFilter

  • ConfigFilter

  • EncodingConvertFilter

  • Slf4jLogFilter

  • Log4jFilter

  • Log4j2Filter

  • CommonsLogFilter

不想使用内置的Filters,要想使自定义Filter配置生效需要将对应Filter的enabled设置为true,Druid Spring Boot Starter默认禁用StatFilter,可以将其enabled设置为true来启用它。

3 监控页面

  1. 启动项目后,访问http://localhost:8081/druid/login.html来到登录页面,输入用户名密码登录,如下所示:

fdb57cff2fb22b0eb243665ba0141ead.png

图片
  1. 数据源页面 是当前DataSource配置的基本信息,上述配置的Filter可以在里面找到,如果没有配置 Filter(一些信息会无法统计,例如SQL监控会无法获取JDBC相关的SQL执行信息)

612be9542e94e2c999de1a7e1775fab7.png

图片
  1. SQL监控页面,统计了所有SQL语句的执行情况

d479c578af082f742b3b4888f9ad1085.png

图片
  1. URL监控页面,统计了所有Controller接口的访问以及执行情况

574fac52f423537d3ea6ff8acb322b16.png

图片
  1. Spring监控页面,利用aop对指定接口的执行时间,jdbc数进行记录

3496776d0679ca527d1ec6159c1f672d.png

图片
  1. SQL防火墙页面

druid提供了黑白名单的访问,可以清楚的看到sql防护情况。

  1. Session监控页面

可以看到当前的session状况,创建时间、最后活跃时间、请求次数、请求时间等详细参数。

  1. JSONAPI页面

通过api的形式访问Druid的监控接口,api接口返回Json形式数据。

4. sql监控

配置Druid web监控filter(WebStatFilter)这个过滤器,作用就是统计web应用请求中所有的数据库信息,比如 发出的sql语句,sql执行的时间、请求次数、请求的url地址、以及seesion监控、数据库表的访问次数,如下配置:

spring:datasource:druid:########## 配置WebStatFilter,用于采集web关联监控的数据 ##########web-stat-filter:enabled: true                   # 启动 StatFilterurl-pattern: /*                 # 过滤所有urlexclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" # 排除一些不必要的urlsession-stat-enable: true       # 开启session统计功能session-stat-max-count: 1000    # session的最大个数,默认100

5. 慢sql记录

有时候,系统中有些SQL执行很慢,我们希望使用日志记录下来,可以开启Druid的慢SQL记录功能,如下配置:

spring:datasource:druid:filter:stat:enabled: true         # 开启DruidDataSource状态监控db-type: mysql        # 数据库的类型log-slow-sql: true    # 开启慢SQL记录功能slow-sql-millis: 2000 # 默认3000毫秒,这里超过2s,就是慢,记录到日志

启动后,如果遇到执行慢的SQL,便会输出到日志中

6. spring 监控

访问之后spring监控默认是没有数据的,但需要导入SprngBoot的AOP的Starter,如下所示:

<!--SpringBoot 的aop 模块-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>

同时需要在application.yml按如下配置:

Spring监控AOP切入点,如com.springboot.template.dao.*,配置多个英文逗号分隔

spring.datasource.druid.aop-patterns="com.springboot.template.dao.*"

7. 去广告(Ad)

访问监控页面的时候,你可能会在页面底部(footer)看到阿里巴巴的广告,如下所示:

37e4ed583d4df7c5ff95fa620ed39f44.png

图片

原因:引入的druid的jar包中的common.js(里面有一段js代码是给页面的footer追加广告的)

如果想去掉,有两种方式:

1. 直接手动注释这段代码

如果是使用Maven,直接到本地仓库中,查找这个jar包,注释如下代码:

// this.buildFooter();

common.js的位置:

com/alibaba/druid/1.1.23/druid-1.1.23.jar!/support/http/resources/js/common.js

2. 使用过滤器过滤

注册一个过滤器,过滤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 com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties* @return org.springframework.boot.web.servlet.FilterRegistrationBean*/@Beanpublic 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() {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {chain.doFilter(request, response);// 重置缓冲区,响应头不会被重置response.resetBuffer();// 获取common.jsString text = Utils.readFromResource(filePath);// 正则替换banner, 除去底部的广告信息text = text.replaceAll("<a.*?banner\"></a><br/>", "");text = text.replaceAll("powered.*?shrek.wang</a>", "");response.getWriter().write(text);}@Overridepublic void destroy() {}};FilterRegistrationBean registrationBean = new FilterRegistrationBean();registrationBean.setFilter(filter);registrationBean.addUrlPatterns(commonJsPattern);return registrationBean;}
}

两种方式都可以,建议使用的是第一种,从根源解决。

8. 获取 Druid 的监控数据

Druid的监控数据可以在开启StatFilter后,通过DruidStatManagerFacade进行获取;

DruidStatManagerFacade#getDataSourceStatDataList该方法可以获取所有数据源的监控数据,除此之外DruidStatManagerFacade还提供了一些其他方法,可以按需选择使用。

@RestController
@RequestMapping(value = "/druid")
public class DruidStatController {@GetMapping("/stat")public Object druidStat(){// 获取数据源的监控数据return DruidStatManagerFacade.getInstance().getDataSourceStatDataList();}
}
 
热门内容:
  • ChatGPT 连夜迭代:你老婆不好使了

  • 动态可监控线程池,你还没用起来吗?

  • 一个超级牛逼的实战项目!同事们模仿了一个月……

  • 955.WLB 不加班公司名单,2023 年最新版!新增 5 家公司

  • 图文详解 Java 泛型,写得太好了!

 

add30e64f24bd8fe75abbbd3fc77cb43.jpeg

 
最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/60282.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用eNSP配置防火墙USG6000v双机热备(VGMP+HRP+OSPF+NAT)

目录 前言 实验拓扑 配置过程 一、导入设备包 二、登陆USG6000v 三、配置接口IP地址 四、配置防火墙安全区域 五、配置内网路由器协议OSPF 五、配置VRRP 六、配置IP-Link联动双机热备 八、配置安全策略 九、配置NAT 十、配置外网路由 配置验证 前言 本实验使用华…

chatgpt赋能python:Python访问路由器

Python访问路由器 路由器是网络连接设备的重要组成部分&#xff0c;用于将信息从一个网络传输到另一个网络。为了使路由器正常运行&#xff0c;需要对其进行配置和管理。Python作为一种广泛应用的编程语言&#xff0c;可以通过多种方式访问和控制路由器。在本文中&#xff0c;…

【运维】使用AP模式接入已有的SP路由器

1. 前言 在使用Parsec时&#xff0c;遇到一个问题&#xff1a;就是Client客户端在接入到Internet时&#xff0c;“最好”只经过一个路由器&#xff08;“Make sure your home isn’t using two routers”&#xff09;&#xff0c;Parsec官方给出的建议是通过AP模式接入SP的路由…

Python发送验证码短信

Python发送验证码短信 前提条件相关介绍实验环境发送验证码短信账户注册查看用户名查看密码主要步骤代码实现输出结果 前提条件 熟悉Python基本语法 相关介绍 Python是一种跨平台的计算机程序设计语言。是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被…

教育培训机构学生管理系统

摘 要 计算机网络如果结合使用信息管理系统&#xff0c;能够提高管理员管理的效率&#xff0c;改善服务质量。优秀的教育培训机构学生管理系统能够更有效管理教育培训机构学生信息业务规范&#xff0c;帮助管理者更加有效管理教育培训机构学生信息&#xff0c;可以帮助提高克服…

班级管理系统

摘要&#xff1a;在国家重视教育影响下&#xff0c;教育部门的密确配合下&#xff0c;对教育进行改革、多样性、质量等等的要求&#xff0c;使教育系统的管理和运营比过去十年前更加理性化。依照这一现实为基础&#xff0c;设计一个快捷而又方便的网上班级管理系统是一项十分重…

【学生管理系统】班级管理

目录 3. 班级管理 3.1 需求 3.1.1 添加班级 3.1.2 班级列表 3.2 搭建环境 3.2.1 前端实现 3.2.2 后端实现&#xff08;9010&#xff09; 3.3 添加班级 3.3.1 查询所有老师 3.3.2 【难】前端&#xff1a;选择老师 3.3.3 后端&#xff1a;添加班级 3.3.4 前端&#x…

postman解决session验证问题,试用验证码校验,带登录状态的请求

在测试后端接口时&#xff0c;我们经常会遇到某个接口是需要权限才能访问&#xff0c;如登录后才能访问&#xff0c;那postman如何模拟已登录的状态呢&#xff1f;再者&#xff0c;如果我们在做注册模块时&#xff0c;后端验证码生成并通过邮箱或短信发送给用户后&#xff0c;必…

TDengine高可用分布式集群详解

本文正在参与“拥抱开源|涛思数据TDengine有奖征稿&#xff1a;投稿地址。 文章目录 一、前言二、举个栗子1、努力工作的小T2、可怜的小T3、小T的老婆小D登场4、小T创业了5、平衡分配任务6、公司越做越大 三、分布式和集群概览1、单点1&#xff09;单点概念2&#xff09;单点故…

鹅厂发布的这个算力集群,最快4天训练万亿参数大模型

​| 文章来源于&#xff1a;“鹅厂技术派”公众号 大模型要成功&#xff0c;算力是关键。 这是腾讯云面向大模型训练场景&#xff0c;发布的全新一代的HCC高性能计算集群性能参数&#xff1a; “算力性能和上一代相比提升3倍&#xff0c;服务器接入带宽从1.6T提升到3.2T。”…

GPU集群使用

文章目录 一、GPU集群使用1、使用ssh远程连接2、新建虚拟环境3、修改信息4、常用命令 一、GPU集群使用 在GPU集群中&#xff0c;会有不同级别的用户&#xff0c;huge(最高级用户)、large(高级用户)、normal(普通用户)&#xff0c;用户的级别不同&#xff0c;权限也不同。 1、…

部署+使用集群的算力跑CPU密集型任务

我先在开头做一个总结&#xff0c;表达我最终要做的事情和最终环境是如何的&#xff0c;然后我会一步步说明我是如何搭建。 要做的事情 尝试如何使用多台机器的算力共同跑一个CPU密集型或者GPU密集型的任务。这里以CPU密集型为例子。 在多台机器搭建MPI环境&#xff0c;构建…

今年你们赚到钱了吗?

峥嵘的2022年&#xff0c;各位程序员们&#xff0c;你们赚到钱了吗&#xff1f; 今天是2022年12月21日&#xff0c;眼看就快过年了&#xff01; 今年你们赚到钱了吗&#xff1f;对于我而言&#xff0c;又是一个"窘迫/囧迫"的穷年&#xff0c;有点心慌慌&#xff0c;有…

教你一招利用python在网上接单赚钱,月薪过万太香了

前言 学习python编程&#xff0c;不仅可以找到一份高薪工作&#xff0c;而且不打算转化或者是在校学生的话&#xff0c;也能为你的日常生活提高一些帮助&#xff0c;比如&#xff1a;自动化办公 爬取一些数据信息之类的…另外闲暇时间也可以在网上接点小单&#xff0c;增加些收…

业余时间赚“外块”的话。给你汇总了用Python挣钱的4个方式,一起来瞧瞧吧~

渠道一&#xff1a;程序流程代笔 到淘宝网/猪八戒在网上搜&#xff1a;Python程序流程。随后到对应的店里找在线客服&#xff0c;便说你要做程序流程开发&#xff0c;是不是可以给个联系电话。渐渐地聊熟识了&#xff0c;还可以变成她们店面里的做兼职技术工程师。 或是添加一…

2023年靠Python接私单赚钱可太香了

假期&#xff0c;闲来无事回顾过去的一年&#xff0c;收益最大的还得是Python爬虫接私单&#xff0c;每每和大家分享都甘之如饴&#xff0c;单看一两个单子可能没什么感觉&#xff0c;但一单接一单&#xff0c;一个月的收获非常可观&#xff01; 这是近期做的爬虫单子&#xf…

宝剑锋从磨砺出 梅花香自苦寒来(高考志愿篇)

各省高考成绩已出&#xff0c;又到一年高考季。张雪峰提到&#xff1a;“普通家庭不要光谈理想&#xff0c;也要谈落地。”志愿怎样填报、选专业还是选学校、什么专业好就业、高考志愿主要看什么&#xff1f;针对这些疑问&#xff0c;你对正在选志愿的毕业生们有什么建议吗&…

海淀育新学校2021高考成绩查询,首师附育新“加工能力”不容小觑!海淀7000名以内可“签约”实验班...

近两年海淀北片的几所高中学校 也越来越受到家长的关注 今天给大家整理了一些 首都师范大学附属育新的数据 例如2021中招计划、班级设置及高考成绩 供今年即将中考的家长参考 下面一起来看看吧 01 2021年招生计划 首都师范大学附属育新学校位于西三旗街道新康园4号。学校2021年…

DDD案例说明

1、案例说明 整个专栏的案例来源于一个虚构的公司&#xff0c;公司里有一个虚构的团队&#xff0c;他们真实的业务章程&#xff0c;并且有一个真实的软件系统需要部署开发部署&#xff0c;而他们所面临的DDD挑战和问题也是真实存在的。 这个公司叫做SaaSOvation。正如名字所示…

Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day15】—— Spring框架1

大家好&#xff0c;我是陈哈哈&#xff0c;北漂五年。认识我的朋友们知道&#xff0c;我是非科班出身&#xff0c;半路出家&#xff0c;大学也很差&#xff01;这种背景来北漂&#xff0c;你都不知道你会经历什么&#x1f643;&#x1f643;。   不敢苟同&#xff0c;相信大家…