Druid高性能数据库连接池?SpringBoot整合MyBatis整合SpringMVC整合Druid

文章目录

  • Druid高性能数据库连接池?SpringBoot整合MyBatis整合SpringMVC整合Druid
    • 异常记录
    • spring-boot-starter-parent作用
    • Druid介绍
    • 什么是数据库连接池?
    • 为什么选择Druid数据库连接池
    • 整合SpringBoot,MyBatis,SpringMVC,Druid到Maven项目的真个流程
      • pom文件引入依赖
      • 在src/main目录下创建resources目录并创建application.properties配置文件
      • 引入Druid监控面板
      • 其它细节

Druid高性能数据库连接池?SpringBoot整合MyBatis整合SpringMVC整合Druid

异常记录

项目启动的时候报了下图中的错误,如下图:
在这里插入图片描述
org/springframework/boot/bind/RelaxedPropertyResolver。
为什么会报这个错误呢?因为我们pom.xml文件中没有引入spring-boot-starter-parent父版本,引入之后就好了 如下图:
在这里插入图片描述
重新启动,如下图:
在这里插入图片描述

spring-boot-starter-parent作用

spring-boot-starter-parent 是一个 Maven 项目中用于构建 Spring Boot 应用程序的父项目。它提供了一种标准化的方式来管理和配置 Spring Boot 应用程序的依赖项、插件和默认设置。

spring-boot-starter-parent 的作用包括:

  1. 继承默认的 Maven 父项目:spring-boot-starter-parent 继承了 Maven 的默认父项目,这意味着你可以利用 Maven 的功能,并继承了一些默认的 Maven 配置。
  2. 默认的依赖项管理:spring-boot-starter-parent 预定义了许多常用的 Spring Boot 相关依赖项,并使用了适当的版本。这样,你在子项目中不需要显式地声明这些依赖项和版本号,而是直接继承父项目中定义的依赖项。
  3. 默认的插件配置:spring-boot-starter-parent 配置了一些常用的 Maven 插件,如编译插件、打包插件等,并使用了适当的配置。这样,你在子项目中可以直接使用这些插件,而无需自己进行复杂的插件配置。

通过使用 spring-boot-starter-parent 作为你的 Maven 父项目,你可以节省很多配置和管理的工作,专注于开发 Spring Boot 应用程序的业务逻辑。同时,它也确保了你的项目和依赖项之间的兼容性,并遵循了 Spring Boot 的最佳实践和规范。

使用了spring-boot-starter-parent作为Maven父项目之后,所有的spring-boot-starter开头的依赖都不用再写版本坐标了,可以直接复用父项目里面的 如下图:
在这里插入图片描述

Druid介绍

Druid是阿里巴巴的一个开源项目,号称为监控而生的数据库连接池,在功能、性能、扩展性方面都超过其他例如DBCP数据库连接池、C3P0数据库连接池。而且Druid已经在阿里巴巴部署了超过600个应用,通过了极为严格的考验,这才收获了大家的青睐!

什么是数据库连接池?

数据库连接池是一个存储数据库连接的缓冲区,用于重复使用这些连接,以避免在每次请求时都创建新的数据库连接。因为每次连接数据库和断开数据库都是非常耗费性能的。

为什么选择Druid数据库连接池

Druid提供了丰富的监控和统计功能,您可以了解连接池的使用情况、SQL执行情况等。这有助于识别性能问题和优化SQL查询。

整合SpringBoot,MyBatis,SpringMVC,Druid到Maven项目的真个流程

pom文件引入依赖

首先快速创建一个Maven项目,然后引入如下pom依赖 如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>druid</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><name>druid</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.7</version></parent><dependencies><!-- 引入SpringBoot的web模块,引入springBoot自带的tomcat服务器,这样才能启动项目服务,比如启动端口号为8080的服务 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 下面的这个spring-boot-starter-test本次项目并没有使用到,这里只不过是为了测试一下如果上面引入了SpringBoot应用程序的父项目只会,所有的spring-boot-starter开头的依赖是不是都不用写版本号了,测试发现确实是这样的--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><!-- MyBatis和SpringBoot整合 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency><!-- Druid数据库连接池和SpringBoot整合 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.15</version></dependency><!-- JDBC java用来连接并操作mysql数据库的 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version></dependency><!-- 引入SpringMVC框架 这样就可以在浏览器里面通过写http接口的方式请求我们的项目服务器了 --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.10</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.18</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.16</version><scope>compile</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency></dependencies>
</project>

在src/main目录下创建resources目录并创建application.properties配置文件

如下图:
在这里插入图片描述
配置文件内容如下:

# 数据源配置
spring.datasource.url = jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver# MyBatis配置
mybatis.mapper-locations = classpath:mapper/*.xml
mybatis.type-aliases-package=org.example.entity# Druid数据库连接池配置
spring.datasource.druid.initial-size=5
spring.datasource.druid.min-idle=5
spring.datasource.druid.max-active=20
spring.datasource.druid.max-wait=60000
spring.datasource.druid.time-between-eviction-runs-millis=60000
spring.datasource.druid.min-evictable-idle-time-millis=300000
spring.datasource.druid.validation-query=SELECT 1 FROM DUAL
spring.datasource.druid.test-while-idle=true
spring.datasource.druid.test-on-borrow=false
spring.datasource.druid.test-on-return=false
spring.datasource.druid.pool-prepared-statements=true
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20
spring.datasource.druid.filters=stat,wall,log4j
spring.datasource.druid.connection-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

注意这里的url最后一定要写上serverTimezone要不然会报错启动,如下图:
在这里插入图片描述

com.mysql.jdbc.Driver和com.mysql.cj.jdbc.Driver的区别,不带cj的是mysql5版本,带cj的是6及以上。

引入Druid监控面板

只需要在SpringBoot项目中引入一个DruidConfig配置类就可以了,如下图:
在这里插入图片描述

/*** @author xuan* @create 2024/4/24*/
@Configuration
public class DruidConfig {//配置druid的监控//1.配置管理后台的servlet@Beanpublic ServletRegistrationBean statViewServlet(){//druid监控页面的urlServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");Map<String,String> initParams = new HashMap<>();initParams.put("loginUsername","druid");   //登陆用户名initParams.put("loginPassword","123456");  //密码initParams.put("allow","");                //允许哪些ipinitParams.put("deny","");                 //拒绝ipbean.setInitParameters(initParams);return bean;}//2.配置一个web监控的filter,监控sql@Beanpublic FilterRegistrationBean webStatFilter(){FilterRegistrationBean bean = new FilterRegistrationBean();bean.setFilter(new WebStatFilter());Map<String,String> initParams = new HashMap<>();initParams.put("exclusions","*.js,*.css,*.html,/druid/*");bean.setInitParameters(initParams);bean.setUrlPatterns(Arrays.asList("/*"));return bean;}/*** Druid的控制台是监控不了SQL的,解决方案* */@Bean@ConfigurationProperties(prefix = "spring.datasource.druid")public DataSource druidDataSource() {DruidDataSource druidDataSource = new DruidDataSource();return druidDataSource;}
}

启动项目在浏览器输入,localhost:8080/druid即可显示面板 如下图:
在这里插入图片描述
但是会存在一个问题 就是我们的SQL监控中没有已经执行的sql 如下图:
在这里插入图片描述
这里是空的,为什么会这样呢?因为我们使用jdbc连接数据库的时候 并没有指定druid数据库连接池 如下图:
在这里插入图片描述
加上之后如下图:
在这里插入图片描述
重新启动项目 打开druid监控面板 如下图:
在这里插入图片描述
sql面板里面就可以输出我们的mysql的sql语句的执行情况了,如上图。

其它细节

其它细节请参照码云:https://gitee.com/xuanyuanzy/druid

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

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

相关文章

Django-admin组件

Django-admin组件 admin是django中提供的一套可视化工具&#xff1a;用于对ORM中定义的表进行增删改查。 1 概览 在django项目启动时&#xff0c;自动找到注册到admin中的所有model中定义的类&#xff0c;然后为这些类生成一系列的URL和视图函数&#xff0c;实现基本增删改查…

Kafka 3.x.x 入门到精通(06)——Kafka进阶

Kafka 3.x.x 入门到精通&#xff08;06&#xff09;&#x1f449;&#x1f449;&#x1f449;&#x1f449; Kafka进阶 3. Kafka进阶3.1 Controller选举3.2 Broker上线下线3.3 数据偏移量定位3.4 Topic删除3.5 日志清理和压缩3.7 页缓存3.8 零拷贝3.9 顺写日志3.10 Linux集群部…

串口通信标准RS232 RS485 RS422的区别

很多工程师经常把RS-232、RS-422、RS-485称为通讯协议&#xff0c;其实这是不对的&#xff0c;它们仅仅是关于串口通讯的一个机械和电气接口标准&#xff08;顶多是网络协议中的物理层&#xff09;&#xff0c;不是通讯协议&#xff0c;那它们又有哪些区别呢&#xff1a; 第一…

python学习笔记----数据容器(六)

一、数据容器的入门 python中的数据容器&#xff1a;一种可以容纳多份数据的数据类型&#xff0c;容纳的每一份数据称之为1个元素。每一个元素&#xff0c;可以是任意类型的数据&#xff0c;如字符串、数字、布尔等。 数据容器根据特点的不同&#xff0c;如&#xff1a; 是否…

PaddlePaddle与OpenMMLab

产品全景_飞桨产品-飞桨PaddlePaddle OpenMMLab算法应用平台

Java的逻辑控制和方法的使用介绍

前言 程序的逻辑结构一共有三种&#xff1a;顺序结构、分支结构和循环结构。顺序结构就是按代码的顺序来执行相应的指令。这里主要讲述Java的分支结构和循环结构&#xff0c;由于和C语言是有相似性的&#xff0c;所以这里只会提及不同点和注意要点~~ 注意在C语言中&#xff0c;…

[C++][算法基础]整数划分(统计动态规划)

一个正整数 &#x1d45b; 可以表示成若干个正整数之和&#xff0c;形如&#xff1a;&#x1d45b;&#x1d45b;1&#x1d45b;2…&#x1d45b;&#x1d458;&#xff0c;其中 &#x1d45b;1≥&#x1d45b;2≥…≥&#x1d45b;&#x1d458;,&#x1d458;≥1。 我们将这…

ThinkPHP Lang多语言本地文件包含漏洞(QVD-2022-46174)漏洞复现

1 漏洞描述 ThinkPHP是一个在中国使用较多的PHP框架。在其6.0.13版本及以前&#xff0c;存在一处本地文件包含漏洞。当ThinkPHP开启了多语言功能时&#xff0c;攻击者可以通过lang参数和目录穿越实现文件包含&#xff0c;当存在其他扩展模块如 pear 扩展时&#xff0c;攻击者可…

notion使用小tip(待补充)

可以替代思维导图是一个很棒的软件 公式编辑&#xff1a;latex 网站链接&#xff1a;LATEX语法 一些常用的用法&#xff1a; 下标&#xff1a;a_{Si} 分数&#xff1a;\frac{}{} 乘&#xff1a;\times 向量&#xff1a;\vec{} pai (3.14159…) : \pi 直接用公式编辑器&#…

React正式更新!开始学习React 19!

本文为原创文章&#xff0c;原文链接&#xff1a;J实验室&#xff0c;未经授权请勿转载 今年2月份&#xff0c;React 发布消息确认今年发布 v19 版本&#xff0c;尘封两年的版本号终于要更新了&#xff08;详情点击&#xff1a;React 19 发布在即&#xff0c;抢先学习一下新特性…

《Fundamentals of Power Electronics》——三端电池的旋转、负载差分连接

以下是关于三端电池的旋转的相关知识点&#xff1a; Buck电路、Boost电路和Buck-Boost电路均包含一个与单刀单掷开关相连的电感。如下图所示。 将上图中的电感和开关网络视为一个标有a,b,c三端的基础电池。该电池在电源和负载之间有三种不同的连接方式。a-A b-B c-C连接方式组…

每日两题 / 46. 全排列 41. 缺失的第一个正数(LeetCode热题100)

46. 全排列 - 力扣&#xff08;LeetCode&#xff09; 经典回溯题&#xff0c;每次搜索选择未选择数字中的一个 当选择了n个数时&#xff0c;将已经选择的数加入答案 class Solution { public:vector<vector<int>> permute(vector<int>& nums) {vector…

Transformer模型详解02-Positional Encoding(位置编码)

文章目录 什么是位置编码连续有界为什么要有界为什么要连续 位置编码的演变用整型值标记位置用[0,1]范围标记位置用二进制向量标记位置用周期函数&#xff08;sin&#xff09;来表示位置sin函数周期振幅&#xff0c;相移&#xff0c;垂直位移频率波长 sin表示位置 用sin和cos交…

QT学习之读取xml中信息

背景&#xff1a; 我们每次注册后会生成对应的启动码文件&#xff0c;格式如下&#xff0c;启动码最后要在测试工具使用的进行一个验证&#xff0c;验证通过后模块才能使用。所以我希望每次的xml都放在一个文件夹里&#xff0c;等我选择文件夹后&#xff0c;能提取所有xml中的对…

【Node.js】03 —— HTTP 模块探索

&#x1f31f;Node.js之HTTP模块探索✨ &#x1f31f;引言 在网络编程中&#xff0c;HTTP协议无处不在。在Node.js的世界里&#xff0c;我们可以通过内置的http模块来轻松创建HTTP服务器和客户端&#xff0c;实现数据的接收和发送。今天就让我们一起打开这扇门&#xff0c;探索…

【QT进阶】Qt http编程之实现websocket server服务器端

往期回顾 【QT进阶】Qt http编程之json解析的简单介绍-CSDN博客 【QT进阶】Qt http编程之nlohmann json库使用的简单介绍-CSDN博客 【QT进阶】Qt http编程之websocket的简单介绍-CSDN博客 【QT进阶】Qt http编程之实现websocket server服务器端 一、最终效果 通过ip地址和端口…

代码随想录算法训练营第二十六天||39. 组合总和、40.组合总和II、131.分割回文串

文章目录 一、39. 组合总和 思路 二、40.组合总和II 思路 三、131.分割回文串 思路 一、39. 组合总和 给定一个无重复元素的数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取…

Vitis HLS 学习笔记--HLS入门示例集合-目录

目录 1. 示例集合概述 2. Interface 接口 2.1 Aggregation_Disaggregation 2.1.1 aggregation_of_m_axi_ports 2.1.2 aggregation_of_nested_structs 2.1.3 aggregation_of_struct 2.1.4 auto_disaggregation_of_struct 2.1.5 disaggregation_of_axis_port 2.1.6 stru…

Liunx磁盘管理(上)

一.硬盘类型 机械硬盘&#xff08;HDD&#xff09; 机械硬盘&#xff08;HDD&#xff09;是一种存储设备&#xff0c;使用旋转磁盘和读/写磁头来存储和检索数据。以下是机械硬盘的基本结构&#xff1a; 盘片&#xff08;Platters&#xff09;&#xff1a;机械硬盘通常由多个盘…

element的el-table 解决表格多页选择数据时,数据被清空

问题&#xff1a;切换页码时&#xff0c;勾选的数据会被清空 重点看我圈出来的&#xff0c;直接复制&#xff0c;注意&#xff0c;我这里 return row.productId;一般大家的是 return row.id,根据接口定的唯一变量 :row-key"getRowKeys"​​​​​​​:reserve-sele…