SpringBoot:SpringBoot集成Druid监控慢SQL

一、前言

  数据库连接池是一个至关重要的组成部分,一个优秀的数据库连接池可以显著提高应用程序的性能和可伸缩性。常见的连接池:Druid、HikariCP、C3P0、DBCP等等,不过目前大部分都是使用Druid或者SpringBoot默认的HikariCP!

  本文将详细介绍如何在Spring Boot项目中配置数据源,集成Druid连接池,以实现更高效的数据库连接管理。

二、常见的连接池介绍

1. C3P0

  开源的JDBC连接池:C3P0实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。

  稳定性好:尽管速度相对较慢(只是慢一丢丢),但稳定性很好,Hibernate和Spring底层就使用了C3P0。

2. DBCP

  Tomcat的数据库连接池:Apache Tomcat DBCP是一个用于管理数据库连接的组件,通常与Apache Tomcat服务器一起使用。

  高效管理:它提供了一种机制来有效地管理数据库连接,以便在高负载下提供更好的性能和可伸缩性。

  配置灵活:可以通过Tomcat的配置文件(如context.xml)或者直接在应用程序中的代码中配置连接池的各种参数。

  验证和性能优化:DBCP可以配置为在从连接池中获取连接时验证连接的有效性,并避免在每次数据库请求时都重新创建和销毁连接,从而提高了性能和效率。

3. HikariCP

  高性能:HikariCP是一个高性能的Java数据库连接池,它通过使用异步和非阻塞的方式,以及一些性能优化的技术,实现了卓越的连接获取和释放性能。

  轻量级:HikariCP的代码库非常小,只有几百KB大小,不依赖大量的外部库和复杂的依赖关系。

  自动化管理:HikariCP具有自动化管理连接池的功能,可以根据应用程序的需求动态调整连接数,并自动管理连接的生命周期。

  配置灵活:提供丰富的可配置选项,支持连接池的最大连接数、最小空闲连接数、连接超时时间等多种配置参数。

4. Druid

  高性能:Druid使用多线程和缓存技术,能够充分发挥数据库的性能,提高应用程序的响应速度。

  监控功能:Druid提供了丰富的监控功能,可以帮助开发人员及时发现和解决数据库连接池的问题。

  扩展性强:Druid具有良好的扩展性,可以轻松地与其他框架集成,满足不同应用程序的需求。

  防御能力:Druid具有强大的防御机制,可以有效地防止SQL注入等攻击。

三、Druid介绍

  Druid是一个由阿里巴巴开源的数据库连接池实现,它结合了C3P0、DBCP等数据库连接池的优点,并加入了日志监控功能。Druid支持所有JDBC兼容的数据库,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等,并针对Oracle和MySql做了特别优化。

  Druid不仅是一个数据库连接池,还提供了强大的监控功能,可以监控SQL的执行时间、ResultSet持有时间、返回行数、更新行数等关键指标,有助于线上分析数据库访问性能

四、Druid的优缺点

Druid的优点:

  高性能:Druid能够在高并发的环境下提供稳定、快速的数据库访问服务。它使用内存缓存、线程池、连接池等先进技术来实现高性能,并且支持对SQL进行解析和优化,选择最合适的执行计划,从而提高数据库的执行效率。

  可扩展性:Druid具有很好的可扩展性,能够根据业务的发展进行灵活的扩展。其设计采用了模块化的思想,各个模块之间解耦,方便进行扩展和升级。同时,Druid还支持各种数据库,可以在不同的数据库之间进行切换。

  稳定性:Druid具有很高的稳定性,能够在系统运行过程中保持稳定,不会出现大的波动。它在内部实现了自动均衡和负载均衡的功能,能够根据数据库服务器的负载情况自动调整负载,保持了系统的稳定性。此外,Druid还具有完善的异常处理机制,能够及时处理异常情况,避免对系统造成大的影响。

  强大的监控能力:Druid具有强大的监控能力,能够实时监控和统计系统的各项指标,如连接数、SQL执行效率、系统负载等。此外,它还支持与第三方监控系统进行集成,方便进行系统的监控和管理。

  丰富的功能:Druid具有丰富的功能,如支持对SQL语句进行动态配置、数据库备份和恢复、分库分表等功能,方便对数据进行管理和访问。

  高可用性:Druid连接池支持对连接的有效性进行检测,可以自动剔除无效的连接,并重新创建新的连接来保证连接的可用性。这些检测机制可以避免应用程序使用无效的数据库连接,提高了应用程序的稳定性和可靠性。

  安全性:Druid连接池提供了多种安全特性,包括防止恶意代码注入、SQL注入和XSS攻击等。它还支持按照IP地址、用户名和密码等方式对连接进行白名单和黑名单过滤,增强了数据库连接的安全性。

  配置灵活:Druid连接池具有丰富的配置选项,可以灵活地配置连接池的参数,以满足不同应用程序的需求。

Druid的缺点:

  依赖性:将Druid引入项目会增加项目的依赖,可能会影响构建和部署的复杂性。

五、Springboot集成Druid

1. 添加依赖

<!-- druid数据源 -->
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.23</version>
</dependency><!-- mysql驱动-->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.30</version>
</dependency><!--mybatis,引入了 SpringBootJDBC 模块,所以,默认是使用 hikari 作为数据源-->
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.0.0</version><exclusions><!-- 排除默认的 HikariCP 数据源 --><exclusion><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId></exclusion></exclusions>
</dependency>

2. 添加配置

# 数据库连接配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mysql?relaxAutoCommit=true&zeroDateTimeBehavior=convertToNull&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root# 配置初始化大小、最小、最大
spring.datasource.druid.initial-size=5
spring.datasource.druid.min-idle=1
spring.datasource.druid.max-active=10# 配置获取连接等待超时的时间(单位:毫秒)
spring.datasource.druid.max-wait=60000# 配置StatViewServlet(监控页面),用于展示Druid的统计信息
spring.datasource.druid.stat-view-servlet.enabled=true# 访问内置监控页面的路径,内置监控页面的首页是/druid/index.html
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
# 监控页面账户与密码
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=admin# 配置WebStatFilter,用于采集web关联监控的数据
spring.datasource.druid.web-stat-filter.enabled=true
spring.datasource.druid.web-stat-filter.url-pattern=/*
spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*# 开启druiddatasource的状态监控
spring.datasource.druid.filter.stat.enabled=true
spring.datasource.druid.filter.stat.db-type=mysql# 开启慢sql监控
spring.datasource.druid.filter.stat.log-slow-sql=true# 超过500ms 就认为是慢sql,记录到日志中,为了测试我这边设置的小一点
spring.datasource.druid.filter.stat.slow-sql-millis=2# 也可以这样子,不过这个使用的都是默认配置了
spring.datasource.druid.filters=stat,wall

3. 启动项目后,访问 /druid/index.html,输入上面配置中的用户名与密码

在这里插入图片描述

4. 去除广告

进来之后发现这里有个广告。展示的不太友好啊。
在这里插入图片描述
添加一个过滤器,把这里不需要显示的js给过滤掉。

@Configuration
@ConditionalOnWebApplication
@AutoConfigureAfter(DruidDataSourceAutoConfigure.class)
@ConditionalOnProperty(name = "spring.datasource.druid.stat-view-servlet.enabled", havingValue = "true", matchIfMissing = true)
public class DruidAdConfig {@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;}
}

重新启动项目,重新登陆账号进入查看。
在这里插入图片描述

5. SQL监控页面

执行一些接口调用之后,在查看SQL监控页面。
在这里插入图片描述

提供了慢SQL的统计信息,如慢SQL的数量、总执行时间、执行行数等。

六、获取Druid的监控数据

  Druid的监控数据可以在开启StatFilter后 ,通过DruidStatManagerFacade进行获取。DruidStatManagerFacade#getDataSourceStatDataList该方法可以获取所有数据源的监控数据,除此之外 DruidStatManagerFacade 还提供了一些其他方法,可以按需选择使用。

@RestController
@RequestMapping(value = "/druid")
public class DruidStatController {@GetMapping("/stat")public Object druidStat(){// 获取数据源的监控数据return DruidStatManagerFacade.getInstance().getDataSourceStatDataList();}
}

在这里插入图片描述

  Druid是一个功能强大、性能优异、易于使用、可扩展和可靠的数据库连接池。在实际应用中,它已经被广泛应用于各种高并发、大数据量和大批量请求的业务场景中,并得到了业界的广泛认可和好评。使用它可以帮我们创建和管理数据库连接,可以使用慢sql等监控功能,使用数据库密码加密等丰富的扩展功能。

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

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

相关文章

一个完整的Flutter应用

15.2 Flutter APP代码结构 | 《Flutter实战第二版》 我们先来创建一个全新的Flutter工程&#xff0c;命名为"github_client_app" 我们在项目根目录下分别创建imgs和fonts、jsons、l10n文件夹 工程目录如下&#xff1a; 在lib下创建文件夹如下&#xff1a; 在“jso…

Word和Excel如何快速对齐姓名

日常工作经常遇到整理参会人员名单时&#xff0c;有2字姓名、3字姓名&#xff0c;为保证文档美观&#xff0c;你是否还在一个一个空格在敲空格&#xff1f; 今天刘小生分享如何在Word和Excel中快速对齐姓名&#xff0c;快来练起来吧&#xff01; 1. Word姓名对齐 【第一步】…

自动化平台总结(httprunner+djangorestframework+python3+Mysql+Vue)【基础结构构思】

一、前言 把一个以前自己搭建的自动化测试平台进行了一下重构升级&#xff0c;记录一下过程中的一些问题和总结。 二、简介 搭建的平台语言使用的是Python3.6&#xff0c;未来有空可能考虑加个java版本。前端用的Vue&#xff0c;主体是httprunner2.XDjangorest-framework&am…

Elasticsearch:智能 RAG,获取周围分块(二)

在之前的文章 “Elasticsearch&#xff1a;智能 RAG&#xff0c;获取周围分块&#xff08;一&#xff09; ” 里&#xff0c;它介绍了如何实现智能 RAG&#xff0c;获取周围分块。在那个文章里有一个 notebook。为了方便在本地部署的开发者能够顺利的运行那里的 notebook。在本…

git 上拉下来的新项目web文件夹没有被idea管理,导致启动不了

让idea识别web项目&#xff0c;操作步骤&#xff1a; 1. 打开idea -- 文件 -- 项目结构&#xff1b; 2. 选择 模块 --- 添加 --- web -- 应用 --- 确定&#xff0c;就好了。 3. 文件夹中间出现个圆圈就是被识别到了。

HarmonyOS模拟器(phone-x86-api9)一直卡顿的解决方法

在DevEco Studio 3.1.1 Release版本中的Device Manager中创建本地的模拟器&#xff0c;创建phone-x86-api9模拟器成功&#xff0c;但是启动该新建的模拟器一直显示"HarmonyOS"logo图片&#xff0c;然后一直卡在这里&#xff0c;运行结果如下所示&#xff1a; 检查模…

记录一次递归查询导致的 java.lang.StackOverflowError: null

问题截图&#xff1a; 由于作者使用递归统计信息&#xff0c;刚开始这个接口运行得正常&#xff0c;但是上线运行一段时间后接口就出现了&#xff0c;如图的栈溢出错误。可以看出确实是堆栈溢出了&#xff0c;解决栈溢出目前只有两种方式&#xff1a; 第一种调大栈的大小&…

精华版 | 2024 Q1全球威胁报告一览

概要 Q1最热门的安全事件是XZ/liblzma后门高危漏洞。开发人员Andres Freund一次偶然情况下&#xff0c;发现了XZ/liblzma存在后门并对该漏洞进行报告。XZ/liblzma是一个广泛使用的开源工具&#xff0c;掌握该后门攻击者几乎可以访问任何运行受感染发行版的 Linux 机器。这一事…

Hadoop3:MapReduce中实现自定义排序

一、场景描述 以统计号码的流量案例为基础&#xff0c;进行开发。 流量统计结果 我们现在要对这个数据的总流量进行自定义排序。 二、代码实现 我们要对总流量进行排序&#xff0c;就是对FlowBean中的sumFlow字段进行排序。 所以&#xff0c;我们需要让FlowBean实现Writab…

360vr党建线上主题展立体化呈现企业的文化理念和品牌形象

在现代科技的引领下&#xff0c;艺术与VR虚拟现实技术相融合必将成为趋势&#xff0c;深圳VR公司华锐视点荣幸地推出VR艺术品虚拟展厅&#xff0c;为您带来前所未有的艺术观赏体验。体验者足不出户即可置身于一个充满创意与灵感的虚拟艺术空间。 我们深入了解每一位客户的需求与…

RestTemple请求GET接口403

问题描述 使用oss接口获取资源的时候&#xff0c;通过浏览器可以直接下载&#xff0c;在代码中使用RestTemplate的get方式访问的时候&#xff0c;出现403错误 问题排查 因为返回状态码是403&#xff0c;就想着是不是授权问题&#xff0c;因为有的接口是有防抓取规则的&…

华为联运:资源混淆导致的浮标显示异常

问题 显示正常 正常情况&#xff0c;华为联运包登录成功之后会显示浮标&#xff08;悬浮球&#xff09;&#xff0c;拖动浮标会出现拖到此处隐藏字样&#xff0c;如下所示&#xff1a; 显示异常 而在我们的横屏游戏中&#xff0c;遇到拖动到此处隐藏有部分内容被遮挡了&…

Windows系统电脑远程桌面控制本地局域网内树莓派详细教程

文章目录 前言1. 树莓派安装xrdp2. 注册cpolar账号3. 安装cpolar内网穿透4. 创建隧道映射端口5. Windows远程桌面控制树莓派总结 前言 本文主要介绍如何通过cpolar内网穿透&#xff0c;映射3389端口&#xff0c;生成公网TCP端口地址&#xff0c;通过该公网地址来实现公网环境下…

网页基础三剑客

目录 一、网页开发技术 1&#xff0e;HTML 2&#xff0e;CSS 3&#xff0e;JavaScript 二、网页的结构 三、 网页的分类 1&#xff0e;静态网页 2&#xff0e;动态网页 1&#xff0e;jQuery 2&#xff0e;AJAX 3&#xff0e;DHTML 2.3.4 网页数据的格式 1&#xf…

使用深度强化学习预测股票:DQN 、Double DQN和Dueling Double DQN对比和代码示例

深度强化学习可以将深度学习与强化学习相结合&#xff1a;深度学习擅长从原始数据中学习复杂的表示&#xff0c;强化学习则使代理能够通过反复试验在给定环境中学习最佳动作。通过DRL&#xff0c;研究人员和投资者可以开发能够分析历史数据的模型&#xff0c;理解复杂的市场动态…

收银系统源码推荐,线下线上一体化收银系统

1.收银系统源码开发语言 核心开发语言: PHP、HTML5、Dart后台接口: PHP7.3后台管理网站: HTML5vue2.0element-uicssjs收银端【安卓/PC收银】: Dart3&#xff0c;框架&#xff1a;Flutter 3.11.0-6.0.pre.27商家小程序助手端: uniapp线上商城: uniapp 2.功能介绍 支持测试体验…

汇编程序入门指南

什么是机器语言&#xff1f; 机器语言就是由二进制数字构成的程序&#xff0c;CPU 可以直接对其解释、执行。 汇编语言、C 语言、Java、BASIC 等编程语言编写的程序&#xff0c;也都需要先转换成机器语言才能被执行。机器语言有时也叫作“原生代码”&#xff08;Native Code&…

智慧校园导航系统:技术驱动下的校园管理与师生体验革新

随着智慧校园建设的不断推进&#xff0c;校园导航系统作为提升校园管理效率、优化师生出行体验的重要工具&#xff0c;正逐渐成为各大高校的标配。本文将重点介绍维小帮智慧校园导航系统&#xff0c;如何通过创新的设计和功能&#xff0c;解决校园导航中的种种难题&#xff0c;…

视频二维码怎么设置全屏播放?默认全屏效果的添加技巧

视频做成二维码如何全屏展示呢&#xff1f;现在很多人都会将视频生成二维码后&#xff0c;分享二维码给其他人来扫码查看视频内容&#xff0c;设置视频默认全屏播放可以带来展示更好的效果&#xff0c;那么横版和竖版视频扫码自动全屏播放是如何生成的呢&#xff1f; 视频二维…

裂变客户时代:如何打造口碑传播的良性循环?【以Notion为例】

在当今的商业环境中&#xff0c;客户裂变已经成为品牌增长的重要驱动力。裂变客户时代&#xff0c;意味着每一个满意的客户都有可能成为品牌的传播者&#xff0c;帮助品牌吸引更多的新客户。那么&#xff0c;如何在这个时代打造口碑传播的良性循环呢&#xff1f;Notion是怎么做…