Spring Boot整合Druid(druid 和 druid-spring-boot-starter)

引言

在现代的Web应用开发中,高性能的数据库连接池是确保应用稳定性和响应性的关键因素之一。Druid是一个开源的高性能数据库连接池,具有强大的监控和统计功能,能够在Spring Boot应用中提供出色的数据库连接管理。本文将研究在Spring Boot中集成Druid连接池的步骤,以及如何通过其丰富的特性优化应用的数据库性能。

数据库连接池

数据库连接池是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态的对池中的连接进行申请、使用、释放。

为什么需要使用数据库连接池

数据库连接是一件费时的操作,连接池可以使多个操作共享一个链接:数据库连接池的基本思想就是为数据库连接建立一个缓冲池,与现在缓冲池中放入一定数量
的连接,当需要建立数据库连接时,只需从缓冲池中取出一个,使用完毕后再放回去:使用数据库连接池可以提高对数据库连接资源的管理,数据库连接池负责分
配、管理和释放数据库连接,允许程序重复使用一个现有的数据库连接,而不是重新建立一个;可以通过设定连接池最大连接数来防止系统无尽的与数据库连接

常见的连接池种类

  1. JDBCP连接池:采用标准的Java EE JDBC AP来实现,同时支持NDl,非常灵活;但是版本比较老了,而且在高并发场景下性能可能存在问题
  2. c3p0连接池:功能齐全,能够自动维护连接池,支持JDBC3规范和JDBC2的标准扩展,性能较好:但是配置过于复杂,容易造成资源浪费
  3. HikariCPi连接池:专为高并发场景设计,性能优越,具有最快的初始化速度和最小的延迟,支持JDBC4 API;但是由于需要更多的VM资源,可能会造成资源消耗问题
  4. druid连接池:支持DBC和Dracle驱动程序,全面的性能监测,对等分布式,具有强大的扩展功能和高度定制化配置

Druid介绍

Druid是一个阿里巴巴结合了c3p0、DBCP等DB池的优点开源的数据库连接池和SQL查询优化工具,用于提高应用程序对数据库的性能和可扩展性。主要提供的功能:数据库连接池、数据库连接池监控、SQL查询优化、数据源管理、防御SQL注入、统计和监控。
注意:SpringBoot2.0默认是用com.zaxxer.hikari.HikariDataSource作为数据源。

  • Druid功能
  1. 数据源监控: 显示数据源的基本信息、活跃连接数、连接等待数量等。

  2. SQL监控: 统计SQL执行的次数、执行时间、错误次数等,帮助优化SQL性能。

  3. 日志监控: 展示Druid内部日志,帮助定位问题。

  4. 防火墙监控: 配置SQL防火墙规则,提高数据库安全性。

查看当前数据源的测试代码
@SpringBootTest
public class DruidTest {@Autowiredprivate DataSource dataSource;@Testvoid test(){System.out.println(dataSource.getClass());}
}


druid 和 druid-spring-boot-starter区别

  • druid-spring-boot-starter 是在 druid 基础上进行了封装,专用于集成 spring-boot 项目,无需编写配置类文件。个性化的配置。为专用格式。按照SpringBoot整合其他技术的通用规则来,导入对应的starter,进行相应的配置即可。
  • druid 需要自己手动编写一个配置类文件。为通用格式,不管你换什么数据源都可以用这种形式进行配置。

druid传统的配置

  • 引入Druid依赖

在Spring Boot项目的pom.xml文件中,引入Druid和数据库驱动的相关依赖:

<!-- MyBatis-Plus -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3</version>
</dependency><!-- MySQL Connector 数据库驱动  -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version>
</dependency>
  • 配置Druid连接池

application.propertiesapplication.yml中配置Druid连接池的相关参数:

spring:datasource:username: rootpassword: root#?serverTimezone=UTC解决时区的报错url: jdbc:mysql://localhost:3306/druiddriver-class-name: com.mysql.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSource#Spring Boot 默认是不注入这些属性值的,需要自己绑定#druid 数据源专有配置initialSize: 5minIdle: 5maxActive: 20maxWait: 60000timeBetweenEvictionRunsMillis: 60000minEvictableIdleTimeMillis: 300000validationQuery: SELECT 1 FROM DUALtestWhileIdle: truetestOnBorrow: falsetestOnReturn: falsepoolPreparedStatements: true#配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入#如果允许时报错  java.lang.ClassNotFoundException: org.apache.log4j.Priority#则导入 log4j 依赖即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4jfilters: stat,wall,log4jmaxPoolPreparedStatementPerConnectionSize: 20useGlobalDataSourceStat: trueconnectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

注意:这些配置暂时还没生效,因为这会还没有把自定义的属性配置上去
我们在配置文件中配置最大连接数为20,初始化连接数为5
测试一下看看

  • 引入Druid依赖(根据自己配置参数按需引入)
<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version>
</dependency>
  • 绑定全局配置文件中的参数
package com.example.config;import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.sql.DataSource;//这是一个配置类 需要加@Configuration 这个注解
@Configuration
public class DruidConfig {/*将 自定义的 Druid数据源 添加到容器中,不再让 Spring Boot 自动创建(自动创建的是HikariDataSource)绑定全局配置文件中的 druid 数据源属性到 com.alibaba.druid.pool.DruidDataSource从而让它们生效,绑定操作就是加上以下注解@ConfigurationProperties(prefix = "spring.datasource"):作用就是将 全局配置文件中前缀为 spring.datasource的属性值注入到 com.alibaba.druid.pool.DruidDataSource 的同名参数中*/@ConfigurationProperties(prefix = "spring.datasource")@Beanpublic DataSource druidDataSource() {return new DruidDataSource();}
}

然后我们再测试一下刚才的测试方法看看配置是否生效

  • 配置Druid数据源监控

Druid数据源具有监控的功能,并提供了一个web界面方便用户查看。我们需要设置Druid,后台管理页面,如登录账号、密码等.

 //配置 Druid 监控管理后台的Servlet;//因为springboot内置了 Servlet 容器,所以没有了web.xml文件, 替代的方法就是 ServletRegistrationBean (Spring Boot的注册 Servlet方式)@Beanpublic ServletRegistrationBean statViewServlet() {ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");// 这些参数可以在 com.alibaba.druid.support.http.StatViewServlet 的父类 com.alibaba.druid.support.http.ResourceServlet 中找到//后台需要有人登录,账号密码的配置Map<String, String> initParams = new HashMap<>();initParams.put("loginUsername", "admin"); //后台管理界面的登录账号initParams.put("loginPassword", "admin"); //后台管理界面的登录密码//后台允许谁可以访问//initParams.put("allow", "localhost"):表示只有本机可以访问//initParams.put("allow", ""):为空或者为null时,表示允许所有访问initParams.put("allow", "");//deny:Druid 后台拒绝谁访问 initParams.put("user", "192.168.1.10");表示禁止此ip访问//设置初始化参数bean.setInitParameters(initParams);return bean;}

启动项目,访问http://localhost:8080/druid/login.html

输入配置账号登录

  • 配置Druid Web监控Filter过滤器
//配置 Druid 监控 之  web 监控的 filter  (在之前是在web.xml中配置过滤器)//WebStatFilter:用于配置Web和Druid数据源之间的管理关联监控统计@Beanpublic FilterRegistrationBean webStatFilter() {FilterRegistrationBean bean = new FilterRegistrationBean();bean.setFilter(new WebStatFilter());//exclusions:设置哪些请求进行过滤排除掉,从而不进行统计Map<String, String> initParams = new HashMap<>();initParams.put("exclusions", "*.js,*.css,/druid/*,/jdbc/*");  //这些东西不进行统计bean.setInitParameters(initParams);// "/*" 表示过滤所有请求bean.setUrlPatterns(Arrays.asList("/*"));return bean;}

druid-spring-boot-starter配置

  • 引入Druid配置

依赖是druid-spring-boot-starter,它基于传统的druid进行了封装,简化了配置,所以使用该依赖,同时引入log4j2的日志依赖,方便我们在监控时获取日志信息。

<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.16</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
  • Druid配置

基于application.yml进行配置


spring:application:name: druid-demodatasource:# 数据库相关配置driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/mybatis01username: rootpassword: rootdruid:# 初始化连接数量initial-size: 5# 最小线连接数量min-idle: 5# 最大连接数量max-active: 20# 获取连接时最大等待时间,单位毫秒max-wait: 60000#销毁线程时检测当前连接的最后活动时间和当前时间差大于该值时,关闭当前连接min-evictable-idle-time-millis: 30000#用来检测连接是否有效的sql 必须是一个查询语句#mysql中为 select 'x'#oracle中为 select 1 from dualvalidation-query: select 'x'#申请连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为truetest-on-borrow: false#归还连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为trutest-on-return: false# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙# 配置监拉统计挡成的filters. stat: 监控统计、Log4j:日志记录、waLL: 防御sqL注入filters: stat,wall,log4j2# 配置后台监控stat-view-servlet:# 允许访问的地址,这里因为时本地所以配置当前机器allow: 127.0.0.1# 是否开启访问enabled: true# 是否能够重置数据reset-enable: false# 管理页面登陆的用户名login-username: admin# 管理页面登陆的密码login-password: admin

可以看到相较于传统的配置(不需要配置DruidConfig,仅仅作为对比)方式:

更加简洁了,开发人员只需要专注于配置信息,就可以快速的配置启用druid了,大大的提高了开发效率

结语

通过本文的介绍,你已经学会了在Spring Boot中集成Druid连接池的全过程,并了解了如何通过Druid的监控页面进行实时监控和统计。Druid连接池不仅提供了高性能的连接池功能,还附带了丰富的监控和统计工具,助力开发者更好地管理和优化数据库性能。在实际项目中,合理配置Druid连接池参数,结合监控页面,将会使应用的数据库性能达到事半功倍的效果。

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

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

相关文章

Macos flatter(用于快速LLL)本地编译安装(解决安装过程各种疑难杂症)

flatter是一个开源项目&#xff0c;能大大提高LLL的速度&#xff0c;项目提供的安装文档适用于Ubuntu&#xff0c;但是在macos上安装&#xff0c;总会遇到各种各样的问题&#xff0c;这里记录下所踩坑&#xff0c;帮助大家快速在macos上安装flatter。 文章目录 1.安装依赖库&am…

Python使用HTTP代理进行网络测试和监控

在Python中&#xff0c;HTTP代理不仅可以用于网络爬虫&#xff0c;还可以用于网络测试和监控。通过使用HTTP代理&#xff0c;我们可以模拟不同的网络环境&#xff0c;测试应用程序在不同情况下的性能和稳定性。此外&#xff0c;我们还可以使用HTTP代理来监控网络流量和性能指标…

C语言编译和链接

翻译环境和运行环境 在ANSI C的任何一种实现中&#xff0c;存在两个不同的环境 .第一种是翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令 .第二种是执行环境&#xff0c;它用于实际执行代码 翻译环境 翻译环境是由编译和链接两个大过程组成&#xff0c;而…

npm run dev 启动vue的时候指定端口

使用的是 Vue CLI 来创建和管理 Vue 项目&#xff0c; 可以通过设置 --port 参数来指定启动的端口号。以下是具体的步骤&#xff1a; 打开命令行终端 进入您的 Vue 项目目录 运行以下命令&#xff0c;通过 --port 参数指定端口号&#xff08;例如&#xff0c;这里设置端口号…

mybatisPlus注解将List集合插入到数据库

1.maven引入依赖&#xff08;特别注意版本&#xff0c;3.1以下不支持&#xff09; <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3.1</version></dependency&g…

自建服务器如何备案?

随着互联网的普及和发展&#xff0c;越来越多的人开始考虑自建服务器。然而&#xff0c;在中国大陆地区&#xff0c;自建服务器需要进行备案。本文将介绍自建服务器备案的流程、所需材料以及注意事项。 一、备案流程 确定备案地区 根据《中华人民共和国计算机信息网络国际联网…

【python】—— 集合

目录 &#xff08;一&#xff09;集合的概念 &#xff08;二&#xff09;集合的使用 2.1 集合的创建 2.2 集合元素的唯一性 2.3 集合的操作 2.3.1 并集 2.3.2 交集 2.3.3 差集 2.3.4 补集 2.4 遍历集合 2.5 其他集合操作 2.5.1 添加元素 2.5.2 移除元素 2.5.3 清…

【Alibaba工具型技术系列】「EasyExcel技术专题」实战技术针对于项目中常用的Excel操作指南

这里写目录标题 EasyExcel教程Maven依赖 EasyExcel API分析介绍EasyExcel 注解通用参数ReadWorkbook&#xff08;理解成excel对象&#xff09;参数ReadSheet&#xff08;就是excel的一个Sheet&#xff09;参数注解参数通用参数 WriteWorkbook&#xff08;理解成excel对象&#…

冒泡排序-BubbleSort

1、基本思路 从数组的左边开始&#xff0c;比较两个元素的大小&#xff0c;当左边大于右边时&#xff0c;更换左右元素位置&#xff0c;否则不改变&#xff1b;接着向右移动一步&#xff0c;比较第二个元素和第三个元素的大小&#xff0c;重复上述操作&#xff0c;直到最后一个…

为什么 Golang Fasthttp 选择使用 slice 而非 map 存储请求数据

文章目录 Slice vs Map&#xff1a;基本概念内存分配和性能Fasthttp 中的 SliceMap性能优化的深层原因HTTP Headers 的特性CPU 预加载特性 结论 Fasthttp 是一个高性能的 Golang HTTP 框架&#xff0c;它在设计上做了许多优化以提高性能。其中一个显著的设计选择是使用 slice 而…

Ubuntu开机停在Grub命令行以及启动后进入emergency模式的解决方法

主机上两个硬盘&#xff0c;本来都是Ubutun系统&#xff0c;然后将其中一个重装为windows系统&#xff0c;结果另外一个硬盘的Ubutun启动不了 首先会卡在grub命令行界面&#xff0c;类似下面这样&#xff1a; 这种情况往往是 GRUB 的系统文件或者配置文件损坏了&#xff0c;但…

基于麻雀优化算法SSA的CEEMDAN-BiLSTM-Attention的预测模型

往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客 风速预测&#xff08;一&#xff09;数据集介绍和预处理-CSDN博客 风速预测&#xff08;二&#xff09;基于Pytorch的EMD-LSTM模型-CSDN博客 风速预测&#xff…

Android: alarm定时很短时,比如500ms,测试执行mPowerManager.forceSuspend()后,系统不会suspend

参考文档&#xff1a; https://blog.csdn.net/weixin_35691921/article/details/124961404 Android: alarm定时很短时&#xff0c;比如500ms&#xff0c;然后执行mPowerManager.forceSuspend()后&#xff0c;系统不会suspend&#xff0c;原因分析&#xff1a; static int ala…

【iOS】——基于Vision Kit框架实现图片文字识别

文章目录 前言一、文本识别的分类二、实现步骤1.导入Vision Kit框架2.创建请求处理器3.在请求处理器中设置文字识别功能4.将图片添加到请求处理器中5.发起文字识别请求6.处理识别结果 三、运行结果测试1.纯英文环境2.中英文混合环境 前言 根据苹果的官方文档&#xff0c;Visio…

【React】脚手架创建项目

文章目录 创建React项目目录结构分析了解PWA脚手架中的webpack 创建React项目 ◼ 创建React项目的命令如下&#xff1a; ​  注意&#xff1a;项目名称不能包含大写字母 ​  另外还有更多创建项目的方式&#xff0c;可以参考GitHub的readme 命令&#xff1a; create-rea…

NRF52832跟NRF52840性能区别 高端蓝牙智能手环穿戴应用

nRF52840可以说是nRF52832的超强升级版&#xff0c;虽然同样是蓝牙5.0&#xff0c;但是整体稳定性和性能上的提升却相差甚远&#xff0c;下面为大家简单讲解下NRF52832和NRF52840的性能上的区别&#xff01; 先说说共同点&#xff1a;这两款芯片都支持蓝牙5.0&#xff0c;MCU也…

谷粒商城篇章8 ---- P236-P247 ---- 购物车【分布式高级篇五】

目录 1 环境搭建 1.1 新建购物车服务模块gulimall-cart 1.2 购物车服务相关配置 1.2.1 pom.xml 1.2.2 yml配置 1.2.2.1 application.yml配置 1.2.2.2 bootstrap.yml配置 1.2.3 主类 1.3 SwitchHosts增加配置 1.4 网关配置 1.5 整合SpringSession 1.5.1 session数据…

禅道下载安装及基本使用(项目周期管理)实施必会!!!

文章目录 前言&#xff1a;一、为什么要使用禅道&#xff1f;二、禅道的下载与安装 前言&#xff1a; 禅道的使用能使公司提高项目管理效率、促进团队协作、支持敏捷开发&#xff0c;并可根据具体需求进行个性化配置。 本文章博主将以一个项目周期来带你们了解禅道。 一、为什…

SCSI/UFS储存架构/协议/电源管理/命令处理流程

UFS子系统架构 1.UFS协议 无论是ufs host controller部分还是ufs device部分&#xff0c;他们都将遵循统一的UFS规范 UFS Application Layer(UAP)应用层 1.UFS command set (UCS) UCS处理命令集&#xff0c;如读、写命令等&#xff0c;.使用的命令是简化的SCSI命令&#xff08;…

ora-12154无法解析指定的连接标识符

用户反映查询的时候报错ora-12154 这个系统只做历史数据查询使用&#xff0c;使用并不平凡&#xff0c;该数据库曾做过一次服务器间的迁移。 用户描述&#xff0c;所有oracle客户端查询该视图都报tns错误&#xff0c;一般ora-12154会发生在连接数据库时&#xff0c;因为tns配…