SpringBoot结合Druid实现SQL监控

1、前言

SpringBoot不用我多介绍了吧,目前后端最流行的框架。后端开发人员最基本的要求。
Druid数据库连接池,出自国内 ”java圣地" 阿里巴巴。
Druid是一个用于大数据实时查询和分析的高容错、高性能开源分布式系统,旨在快速处理大规模的数据,并能够实现快速查询和分析。

  1. Druid的低延迟数据摄取架构允许事件在它们创建后毫秒内可被查询到,这使其具有快速的交互式查询能力。同时,Druid的数据在系统更新时依然可用,规模的扩大和缩小都不会造成数据丢失,这意味着它具有高可用性。
  2. Druid出自Alibaba,已实现每天能够处理数十亿事件和TB级数据,说明其具有可扩展性。在实际应用场景中,例如需要交互式聚合和快速探究大量数据、需要实时查询分析、具有大量数据等情况下,Druid都可以发挥出其高可用、高容错、高性能的优势。

总的来说,Druid是一个功能强大、性能优异且具有良好扩展性的分布式系统,适用于处理大规模数据并支持实时查询和分析。

如果想了解Druid数据库连接池在Java中最基本的使用,可以看我之前的文章:
Alibaba Druid数据库连接池直接起飞

其他文档的链接地址:

  • GitHub地址: https://github.com/alibaba/druid
  • 官方文档: https://github.com/alibaba/druid/wiki/Druid连接池介绍
  • Starter文档: https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter

2、Druid数据库连接池的基本参数

参数名称默认值说明
driver-class-namenull数据库连接驱动
usernamenull数据库连接用户名
passwordnull数据库连接密码
url null数据库连接的URL
initial-size0初始化时建立连接的个数
max-active 8最大连接池数量
min-idle0最小连接池数量
max-wait-1获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
use-global-data-source-stattrue是否开启SQL统计
validation-querynull用来检测连接是否有效的sql,要求是一个查询语句,常用SELECT 1 FROM DUAL
validation-query-timeout-1检测连接是否有效的超时时间,单位是秒
login-timeoutnullDruid Monitor登录超时时间
transaction-query-timeoutnull事务查询超时时间
query-timeoutnull查询超时时间
test-while-idletrue建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
time-between-eviction-runs-millis60s配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
min-evictable-idle-time-millis30分钟配置一个连接在池中最小生存的时间,单位是毫秒
max-evictable-idle-time-millis7小时配置连接池中连接,在时间段内一直空闲,被逐出连接池的时间,单位毫秒。
default-read-only null设置连接为只读状态
default-transaction-isolation null事务的隔离级别

以上标红的属性都是常用的属性,Druid连接池的参数有很多,在后面的配置中可以自行配置

3、实践

项目环境:

  1. IDEA 2023
  2. SpringBoot
  3. Mybatis-plus
  4. lombok
  5. Druid-starter
  6. MySQL 8.0

3.1、导入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId>
</dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version>
</dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.20</version>
</dependency>

3.2、yaml文件

server:port: 8888spring:data:redis:host: localhostport: 6379main:lazy-initialization: truebanner-mode: offdatasource:druid:driver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: 123456url: jdbc:mysql://localhost:3306/taobao?serverTimezone=Asia/Shanghaiinitial-size: 1 # 初始化时建立连接的个数max-active: 1 # 最大连接池数量min-idle: 1 # 最小连接池数量max-wait: 6000 # 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
#      pool-prepared-statements: false # 是否缓存preparedStatement, MySQL建议关闭use-global-data-source-stat: true # 开启SQL统计validation-query: SELECT 1 FROM DUAL #用来检测连接是否有效的sql,要求是一个查询语句,常用SELECT 1 FROM DUALvalidation-query-timeout: 3000 # 检测连接是否有效的超时时间,单位是秒login-timeout: 3000 # 登录超时时间transaction-query-timeout: 3000 # 事务查询超时时间query-timeout: 3000 # 查询超时时间
#      test-on-borrow: false # 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
#      test-on-return: false # 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能test-while-idle: true # 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
#      time-between-eviction-runs-millis: 30000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
#      min-evictable-idle-time-millis: 300000 #配置一个连接在池中最小生存的时间,单位是毫秒
#      max-evictable-idle-time-millis: 600000 #配置连接池中连接,在时间段内一直空闲,被逐出连接池的时间,单位毫秒。default-read-only: false # 是否只读default-transaction-isolation: 4 #事务的隔离级别web-stat-filter: # 开启Druid过滤器enabled: true # 开启StatFilterurl-pattern: /*exclusions: "*.jpg,*.png,*.jpeg"profile-enable: true # 是否监控单个URL调用的SQL列表stat-view-servlet: # 开启Druid Servlet拦截enabled: true # 是否启用StatViewServleturl-pattern: /druid/* #监控页面拦截urlreset-enable: true #是否启用重置功能login-password: druidlogin-username: druidaop-patterns:- /database/listfilter: # 进行慢SQL展示stat:enabled: trueslow-sql-millis: 500log-slow-sql: true # 以日志的形式输入SQLmerge-sql: true # 是否合并SQLdb-type: mysqlmybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplglobal-config:banner: falsemapper-locations: classpath:/mapper/*.xml

3.3、运行

项目启动后, 我们可以直接访问http://localhost:项目端口/druid/login.html就可以进行Druid Monitor.
这些页面都是Druid已经写好了的,就在我们引入的Jar包或者依赖里头:
在这里插入图片描述

3.3.1、登录页面

我们可以在登录页面输入我们设置好的login-username用户名和login-password密码进行登录.
在这里插入图片描述

3.3.2 、首页

我们可以在首页看到一些列运行的环境.
在这里插入图片描述

3.3.3 、SQL监控

因为我们配置了测试连接, 所以在项目启动后会进行一次连接测试, 连接测试的SQL就是validation-query参数所配置的SQL.
从图中也可以看出进行了连接测试
在这里插入图片描述

3.4 、编写controller进行测试

本项目使用了Mybatis-plus作为ORM框架, 具体的DAO层就是那么一套逻辑, 所以省略, 只显示controller接口层.

@RestController
@RequestMapping(value = "/database")
public class ProductController {@Resourceprivate ProductMapper productMapper;@GetMapping(value = "/list")public List<Product> productList(){return productMapper.selectPage(new Page<>(1, 10), null).getRecords();}}

我们可以很清楚的看到SQL的执行被监听到了.
在这里插入图片描述
因为我执行了分页的操作, Mybatis-plus的底层是执行了统计数量进行分页的两条SQL, 都被监听到了.

3.5 、其他参数

当我们能够进入到Druid Monitor后, 可以进入数据源页面.
在这里插入图片描述
表格最左侧的参数就是Druid可以配置的参数, 我这里使用的是中文进行展示, 伙伴们可以切换成英文进行展示.

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

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

相关文章

新年学新语言Go之五

一、前言 Go虽然不算是面向对象语言&#xff0c;但它支持面向对象一些特性&#xff0c;面向接口编程是Go一个很重要的特性&#xff0c;而Go的接口与Java的接口区别很大&#xff0c;Go的接口比较复杂&#xff0c;这里仅用一个最简单例子做介绍&#xff0c;复杂的我也还没学。 …

filebeat(8.9.0)采集日志到logstash,由logstash发送的es

filebeat采集日志到logstash&#xff0c;由logstash发送的es 下载并配置filebeat下载配置logback.xml logstash配置 下载并配置filebeat 下载 参考 配置 filebeat.inputs: - type: filestreamenabled: truepaths:# 日志文件目录- D:\modellog\elkdemo\*\*.logparsers:# 多…

LeetCode2409——统计共同度过的日子数

博主的解法过于冗长&#xff0c;是一直对着不同的案例debug修改出来的&#xff0c;不建议学习。虽然提交成功了&#xff0c;但是自己最后都不知道写的是啥了哈哈哈。 package keepcoding.leetcode.leetcode2409; /*Alice 和 Bob 计划分别去罗马开会。给你四个字符串 arriveA…

分发糖果[困难]

优质博文&#xff1a;IT-BLOG-CN 一、题目 n个孩子站成一排。给你一个整数数组ratings表示每个孩子的评分。你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 【1】每个孩子至少分配到1个糖果。 【2】相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩…

浅谈 docker run 命令中的 -i -t 和 -d 选项

以 docker Ubuntu 镜像为例&#xff0c;ubuntu镜像启动时默认执行的命令是"/bin/bash"。 文章目录 不带任何选项带 -i 选项带 -i 和 -t 选项-d 选项 不带任何选项 rootubuntu20:~# docker run ubuntu:20.04 rootubuntu20:~# docker ps CONTAINER ID IMAGE …

DDOS攻击的有效防护方式有哪些?

DDoS攻击简介&#xff1a; DDoS攻击&#xff0c;即分布式拒绝服务攻击&#xff08;Distributed Denial of Service&#xff09;&#xff0c;是一种网络攻击&#xff0c;旨在通过向目标服务器发送大量恶意请求&#xff0c;使服务器资源耗尽&#xff0c;无法满足合法用户的需求&a…

网络协议--ARP:地址解析协议

4.1 引言 本章我们要讨论的问题是只对TCP/IP协议簇有意义的IP地址。数据链路如以太网或令牌环网都有自己的寻址机制&#xff08;常常为48 bit地址&#xff09;&#xff0c;这是使用数据链路的任何网络层都必须遵从的。一个网络如以太网可以同时被不同的网络层使用。例如&#…

git创建与合并分支

文章目录 创建与合并分支分支管理的概念实际操作 解决冲突分支管理策略Bug分支Feature分支多人协作 创建与合并分支 分支管理的概念 分支在实际中有什么用呢&#xff1f;假设你准备开发一个新功能&#xff0c;但是需要两周才能完成&#xff0c;第一周你写了50%的代码&#xf…

《动手学深度学习 Pytorch版》 9.6 编码器-解码器架构

为了处理这种长度可变的输入和输出&#xff0c; 可以设计一个包含两个主要组件的编码器-解码器&#xff08;encoder-decoder&#xff09;架构&#xff1a; 编码器&#xff08;encoder&#xff09;&#xff1a;它接受一个长度可变的序列作为输入&#xff0c;并将其转换为具有固定…

React +AntD + From组件重复提交数据(已解决)

开发场景&#xff1a; react Hooks andt 提交form表单内容给数据库(使用antd的form组件) 问题描述 提交是异步的&#xff0c;请提交方式是POST 方式 提交表单内容给后端&#xff0c;却产生了两次提交记录&#xff08;当然&#xff0c;数据新增了两条数据&#xff09;。可以…

基于WebRTC的程序因虚拟内存不足导致闪退问题的排查以及解决办法的研究

目录 1、WebRTC简介 2、问题现象描述 3、将Windbg附加到目标进程上分析 3.1、Windbg没有附加到主程序进程上&#xff0c;没有感知到异常或中断 3.2、Windbg感知到了中断&#xff0c;中断在DebugBreak函数调用上 3.3、32位进程用户态虚拟地址和内核态虚拟地址的划分 …

分享5个解决msvcp140.dll丢失的方法,全面解析msvcp140.dll丢失的原因

一、MSVCP140.dll是什么&#xff1f; 首先&#xff0c;我们需要了解什么是MSVCP140.dll。MSVCP140.dll是一个动态链接库文件&#xff0c;它是Microsoft Visual C 2015 Redistributable的一部分。这个文件包含了运行使用C编写的应用程序所需的一些函数和类。因此&#xff0c;当…

MongoDB URL链接 如何设置账号密码

个人博客&#xff0c;求关注。。 MongoDB URL链接 如何设置账号密码 假设你的账号是root&#xff0c;你的密码也是root&#xff0c;则 mongodb://username:passwordlocalhost:27017完美&#xff0c;再见。

探索LLM在图上学习的潜力10.14 暂停

探索LLM在图上学习的潜力 摘要介绍初步知识 摘要 Learning on Graph已经引起了极大的关注&#xff0c;因为它在现实世界中有广泛的应用。在具有文本节点属性的图形上进行学习的最流行的流程主要依赖于图神经网络&#xff08;GNN&#xff09;&#xff0c;并利用浅层文本嵌入作为…

Maven系列第8篇:大型Maven项目,快速按需任意构建

本篇涉及到的内容属于神技能&#xff0c;多数使用maven的人都经常想要的一种功能&#xff0c;但是大多数人都不知道如何使用&#xff0c;废话不多说&#xff0c;上干货。 需求背景 我们需要做一个电商项目&#xff0c;一般都会做成微服务的形式&#xff0c;按业务进行划分&am…

【LeetCode 算法专题突破】滑动窗口(⭐)

文章目录 前言1. 长度最小的子数组题目描述代码 2. 无重复字符的最长子串题目描述代码 3. 最大连续1的个数 III题目描述代码 4. 将 x 减到 0 的最小操作数题目描述代码 5. 水果成篮题目描述代码 6. 找到字符串中所有字母异位词题目描述代码 7. 串联所有单词的子串题目描述代码 …

关于我对 jeecg-boot 的项目理解、使用心得和改进建议

一句话总结&#xff1a; JeecgBoot帮助我提升了后端技术水平&#xff0c;入门了前端&#xff0c;让我在公司内部慢慢能够成长为全栈开发。 一、项目理解 JeecgBoot 项目的核心理念是快速开发、低代码、易扩展。它采用了前后端分离的架构&#xff0c;后端使用Spring Boot Myba…

用节点亲和性把 Pod 分配到节点

用节点亲和性把 Pod 分配到节点 当前集群信息&#xff1a; rootk8s-master:~# kubectl get node -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME k8s…

微信小程序OA会议系统数据交互

前言 经过我们所写的上一文章&#xff1a;微信小程序会议OA系统其他页面-CSDN博客 在我们的是基础面板上面&#xff0c;可以看到出来我们的数据是死数据&#xff0c;今天我们就完善我们的是数据 后台 在我们去完成项目之前我们要把我们的项目后台准备好资源我放在我资源中&…