SpringBoot结合Druid实现SQL监控

news2024/11/20 0:33:09

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: 8888

spring:
  data:
    redis:
      host: localhost
      port: 6379
  main:
    lazy-initialization: true
    banner-mode: off
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      username: root
      password: 123456
      url: jdbc:mysql://localhost:3306/taobao?serverTimezone=Asia/Shanghai
      initial-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 DUAL
      validation-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 # 开启StatFilter
        url-pattern: /*
        exclusions: "*.jpg,*.png,*.jpeg"
        profile-enable: true # 是否监控单个URL调用的SQL列表
      stat-view-servlet: # 开启Druid Servlet拦截
        enabled: true # 是否启用StatViewServlet
        url-pattern: /druid/* #监控页面拦截url
        reset-enable: true #是否启用重置功能
        login-password: druid
        login-username: druid
      aop-patterns:
        - /database/list
      filter: # 进行慢SQL展示
        stat:
          enabled: true
          slow-sql-millis: 500
          log-slow-sql: true # 以日志的形式输入SQL
          merge-sql: true # 是否合并SQL
          db-type: mysql


mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    banner: false
  mapper-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 {

    @Resource
    private 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.coloradmin.cn/o/1112254.html

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

相关文章

迅为RK3568开发板RTMP推流之视频监控

1 搭建 RTMP 媒流体服务器 nginx-rtmp 是一个基于 nginx 的 RTMP 服务模块&#xff0c;是一个功能强大的流媒体服务器模块&#xff0c; 它提供了丰富的功能和灵活的配置选项&#xff0c;适用于构建各种规模的流媒体平台和应用。无论是搭建实时视频直播平台、点播系统或多屏互…

【Qt】常见控件

文章目录 按钮组QListWidget列表容器TreeWidget树控件TableWidget 表格控件其它控件介绍下拉框QLabel显示图片和动图 自定义控件封装 按钮组 QPushButton 常用按钮 QToolButton 工具按钮&#xff1a; 用于显示图片 如果想显示文字&#xff1a;修改风格&#xff1a;toolButto…

分类预测 | MATLAB实现基于BiGRU-AdaBoost双向门控循环单元结合AdaBoost多输入分类预测

分类预测 | MATLAB实现基于BiGRU-AdaBoost双向门控循环单元结合AdaBoost多输入分类预测 目录 分类预测 | MATLAB实现基于BiGRU-AdaBoost双向门控循环单元结合AdaBoost多输入分类预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于BiGRU-AdaBoos…

Hadoop3教程(二十五):Yarn的多队列调度器使用案例

文章目录 &#xff08;136&#xff09;生产环境多队列创建&好处&#xff08;137&#xff09;容量调度器多队列提交案例如何创建多个队列如何向指定队列提交任务 &#xff08;138&#xff09;容量调度器任务优先级&#xff08;139&#xff09;公平调度器案例参考文献 &#…

【Java 进阶篇】JavaScript 表格全选案例详解

在网页开发中&#xff0c;表格&#xff08;Table&#xff09;是一种常用的HTML元素&#xff0c;用于以表格形式展示数据。对于包含大量数据的表格&#xff0c;提供一个全选复选框可以极大地提高用户体验&#xff0c;方便用户一次性选择或取消选择所有项目。本篇博客将详细介绍如…

Mac电脑版交互式原型设计软件 Axure RP 8汉化 for mac

Axure RP 8是一款专业快速原型设计软件&#xff0c;它主要用于定义需求、设计功能和界面等&#xff0c;适用于商业分析师、信息架构师、产品经理、IT咨询师、用户体验设计师、交互设计师和UI设计师等用户。 该软件可以快速、高效地创建原型&#xff0c;并支持多人协作设计和版…

彩虹云商城自助发卡商城-卡卡云主题

彩虹云商城自助发卡商城-卡卡云主题 全新SUP模板/知识付费模板/卡卡云模板&#xff0c;首页美化&#xff0c;登陆页美化修复了pc端显示不正常的问题。 将这俩个数据库文件导入数据库。 其他的直接导入网站根目录覆盖就好。 PS&#xff1a;若首页显示不正常&#xff1a;请去…

MYSQL学习笔记2-mysql数据文件

1.mysql数据文件类型&#xff1f;5.7和8的一些区别 创建一个anadb的数据库&#xff1a;在mysql安装目录下data目录下会产生一个同名的文件夹 建表&#xff1a;图为mysql57的数据文件图&#xff0c;不同的引擎建表会产生不同后缀名的文件 &#xff0c;mysql5.5以上默认使用 inno…

新手指南|如何快速参与Moonbeam Ignite

Moonbeam Ignite是社区熟悉的有奖链上交互活动&#xff0c;将有300万枚GLMR作为生态激励注入Moonbeam生态系统&#xff0c;体验MoonbeamMoonbeam生态的应用即可获取相应Token奖励。Beamex/Beamswap、Moonwell和Gamma作为首批参与Moonbeam Ignite的三家项目方&#xff0c;将在活…

机器学习(23)---Boosting tree(课堂笔记)

文章目录 一、知识记录二、题目2.1 题目12.2 题目22.3 答案书写 一、知识记录 二、题目 2.1 题目1 2.2 题目2 2.3 答案书写

一百九十一、Flume——Flume配置文件各参数含义(持续完善中)

一、目的 在实际项目的开发过程中&#xff0c;不同Kafka主题的数据规模、数据频率&#xff0c;需要配置不同的Flume参数&#xff0c;而这一切的调试、配置工作&#xff0c;都要建立在对Flume配置文件各参数含义的基础上 二、Flume各参数及其含义 &#xff08;一&#xff09;…

touch - 创建空文件与修改时间戳

touch命令的功能是用于创建空文件与修改时间戳。如果文件不存在&#xff0c;则会创建出一个空内容的文本文件&#xff1b;如果文件已经存在&#xff0c;则会对文件的Atime&#xff08;访问时间&#xff09;和Ctime&#xff08;修改时间&#xff09;进行修改操作&#xff0c;管理…

数字秒表设计仿真VHDL跑表,源码,视频

名称&#xff1a;简单秒表设计仿真VHDL跑表 软件&#xff1a;Quartus 语言&#xff1a;VHDL 代码功能&#xff1a; 数字秒表功能描述 本次练习只需要一个数码管(假设该数码管已被选中),实现数码管显示功能,具体要求如下(设数码管为共阳&#xff09; 1)实现秒表计时功能。…

阿里云安装 redis

1、在opt目录下面安装redis https://download.redis.io/redis-stable.tar.gz redis的最新稳定版本。更多版本可见 redis cd /opt wget https://download.redis.io/redis-stable.tar.gz2、解压tar包&#xff0c;会生成redis-stable文件夹 tar -xzvf redis-stable.tar.gz3、安装…

NLP Bi-Encoder和Re-ranker

Retrieve & Re-Rank https://www.sbert.net/examples/applications/retrieve_rerank/README.html Bi-Encoder vs. Cross-Encoder https://www.sbert.net/examples/applications/cross-encoder/README.html Bi-Encoder会用BERT对输入文本编码&#xff0c;再根据cosine相似度…

JAVAEE初阶相关内容第十五弹--网络編程

写在前 简单描述一下关于路由器的三层转发和交换机的二层转发。 路由器是三层转发-->在网络层转发。【需要解析出IP协议中的源IP、目的IP来规划路径】 交换机是二层转发-->在数据链路层转发。【只需要关注下一步发展到哪个相邻的设备上&#xff0c;不需要IP地址&#…

人工智能发展与结构科学

人工智能&#xff08;AI&#xff09;在各种应用中的影响力不断增强&#xff0c;从简单的计算任务到复杂的决策支持。但在这背后&#xff0c;AI的发展其实是一个关于结构演变的故事。从最早的线性结构&#xff0c;到今天的复杂网络结构&#xff0c;结构的演变对AI的能力和效率产…

【离线/并查集】CF1213 G

想起来好久没写题解了&#xff0c;随便写一下把 感觉写多了div3后面的题就变得简单了&#xff0c;div3似乎没什么思维含量&#xff0c;甚至有时候能开出div3的2100.... 心血来潮写一下这个*1800的题解&#xff0c;思路一下就出了&#xff0c;但是一开始多了个log被卡了&#x…

C#通过Entity Framework实体对数据表增删改查

目录 一、创建实体数据模型 1.建立数据库连接 2.建立EF实体模型 二.设计窗体和EF应用 1.窗体设计 2.应用程序设计 3.源码 4.生成效果 &#xff08;1&#xff09;查询 &#xff08;2&#xff09;修改 &#xff08;3&#xff09;删除 &#xff08;4&#xff09;增加 …

Python 文件打包成可执行文件

打包 要将Python脚本打包成可执行文件&#xff0c;常见的做法是使用PyInstaller或cx_Freeze工具。下面是使用PyInstaller的基本步骤&#xff1a; 使用conda安装pyinstaller &#xff08;建议&#xff09; conda install -c conda-forge pyinstaller上面的命令从conda-forge通…