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.mzph.cn/news/829027.shtml

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

相关文章

OSPF域间路由防环原则

1.域间路由防环原则 ①原则一 1&#xff09;为了避免区域间的环路&#xff0c;OSPF规定不同区域间的路由交互只能通过ABR实现。 2&#xff09;ABR是连接到骨干区域的&#xff0c;所以在区域设计上规定&#xff0c;所有非骨干区域都要连接到骨干区域。区 域间的通讯需要通…

C语言进阶:进阶指针(下)

一、 函数指针数组 我们都知道 数组是一个存放相同类型数据的存储空间 那我们已经学习了指针数组 那么函数有没有对应的指针数组呢&#xff1f; 如果有那应该怎么定义呢&#xff1f; 1. 函数指针数组的定义 我们说 函数指针数组的定义 应该遵循以下格式 int (*p[10])(); 首…

SpringBoot Aop使用篇

Getting Started SpringBoot AOP的实践 AOP相关的概念&#xff1a; Aspect&#xff08;切面&#xff09;&#xff1a; Aspect 声明类似于 Java 中的类声明&#xff0c;在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。就是抽离出来的逻辑类&#xff0c;比如日志、权限…

C++及QT的线程学习

目录 一. 线程学习 二. 学习线程当中&#xff0c;得到的未知。 1. 了解以下MainWindow和main的关系 2. []()匿名函数 有函数体&#xff0c;没有函数名. 3. join和detach都是用来管理线程的生命周期的&#xff0c;它们的区别在于线程结束和资源的回收。 4. operator()() 仿…

4G组网三相四线预付费电表-远程集中抄表

安科瑞薛瑶瑶18701709087/17343930412 DTSY1352 三相预付费电能表分别用于计量额定频率50Hz 的单、三相交流有功电能&#xff0c;具有预付费控制、负载控制、时间控制及 RS485 通信等功能&#xff0c;性能指标符合 GB/T17215.321-2008 标准。是改革传统用电体制&#xff0c…

杰理695的UI模式LED灯控制

UI模式LED灯修改每个模式对应的LED灯闪烁修改在ui_normal_status_deal(u8 *status, u8 *power_status, u8 ui_mg_para)

开源克隆声音的项目-OpenVoice V2

myshell的OpenVoice 出v2版本了 只需要上传一段20秒到5分钟之间的声音&#xff0c;就可以克隆声音。 单人讲话 没有背景噪音 时间在20秒至5分钟之间 本地部署我没有做&#xff0c;我在myshell的官网上测试了一下&#xff0c;可能是上传的音频有杂音&#xff0c;导致不是很清…

人机交互系统文本分类 text classification环节源码(E-commerce)

我把pre-trained model 下载到了本地 效果如下&#xff08;到时候把代码中的sequence 和labels换成自己的text和分类就行了。&#xff09;&#xff1a; 源码见链接&#xff1a; https://download.csdn.net/download/qqqweiweiqq/89211553

2024年好用又便宜的云手机!哪款性价比高?

随着科技的飞速发展&#xff0c;云计算技术也在不断演进&#xff0c;而云手机作为其创新之一&#xff0c;已经开始在我们的生活中崭露头角。它通过将手机的硬件和软件功能移到云端&#xff0c;让用户能够借助强大的云计算资源完成各种任务。2024年&#xff0c;哪款云手机性价比…

Ubuntu关闭防火墙、关闭selinux、关闭swap

关闭防火墙 打开终端&#xff0c;然后输入如下命令&#xff0c;查看防火墙状态&#xff1a; sudo ufw status 开启防火墙命令如下&#xff1a; sudo ufw enable 关闭防火墙命令如下&#xff1a; sudo ufw disable 关闭selinux setenforce 0 && sed -i s/SELINUXe…

QML中使用正则表达式

我想在TextField控件中使用正则表达式&#xff0c;然后GPT4给出的回答是这样的&#xff1a; TextField {id: versionInputplaceholderText: qsTr("输入版本号")validator: RegExpValidator { regExp: /^[a-zA-Z0-9]*$/ } // 仅允许字母和数字width: 120 // 设置合…

SpringBoot中多数据源灵活切换解决方案

本篇内容介绍了“SpringBoot中如何使用Dynamic Datasource配置多数据源”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 源码地址/文档说明 功能特性: 支持 数据源分组…

软件设计师-重点的创建型设计模式

一、简单工厂&#xff1a; 简单工厂模式属于创建型模式&#xff0c;但不属于23种设计模式之一。 软考中图 二、工厂方法&#xff1a; 意图&#xff1a; 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。 结…

YOLOV5 TensorRT部署 BatchedNMS(engine模型推理)(下)

主要是在王新宇代码的基础上改进,引入对BatchedNMS的解码 文章目录 1. 修改yolov5.cpp2.修改yololayer.h1. 修改yolov5.cpp 首先增加全局变量,名字根据转onnx时修改的节点名字来,查看onnx文件可以看到,顺序不要弄错。 const char *INPUT_NAME = “images”; const char …

FFmpeg常用结构体、关键函数、ffplay.c分析

一、常用结构体&#xff1a; 1、AVFormatContext结构体&#xff1a; AVFormatContext是一个贯穿全局的数据结构&#xff0c;很多函数都要用它作为参数。FFmpeg代码中对这个数据结构的注释是format I/O context&#xff0c;此结构包含了一个视频流的格式内容。其中存有AVIputFor…

抖音小店值得做吗?前期需要多少资金的投入?

大家好&#xff0c;我是电商糖果 这两天有位想做店的朋友&#xff0c;问了糖果一个问题。 他说开个体店是不是需要办理个体户营业执照。 我回答是的。 他又问办执照是不是需要花钱。 我说自己去工商局办理是免费的&#xff0c;找人代办市场上的价格一般在二百左右。 对方…

最大层内元素和

题目链接 最大层内元素和 题目描述 注意点 返回层内元素之和 最大 的那几层&#xff08;可能只有一层&#xff09;的层号&#xff0c;并返回其中 最小 的那个树中的节点数在 [1, 10000]范围内-10^5 < Node.val < 10^5 解答思路 广度优先遍历树&#xff0c;使用队列存…

应用内竞价(Bidding)技术为什么一定要结合瀑布流广告分层+混合智能排序技术?

应用内竞价&#xff08;In-App Bidding或Header Bidding&#xff09;即在APP端实现竞价的优势显而易见&#xff0c;接入的所有广告平台按价格实时排序&#xff0c;价高者得&#xff0c;这样使得每次广告请求收益都是最大值&#xff0c;从而实现收益最大化。 竞价机制是买卖双方…

改善员工绩效管理的 8 种最佳方法

企业如何改进绩效管理体系&#xff0c;才能获得最好的结果&#xff1f;请仔细阅读&#xff0c;找出答案… 人力资源部门对组织的成功起着至关重要的作用&#xff0c;组织的员工也是如此。更好的组织管理会带来更高的利润。人力资源部门的工作很大一部分就是规范绩效管理体系&a…

19-Echarts 配置系列之: timeline 动态切换

前言&#xff1a; timeline 动态切换 作用&#xff1a;在同一个图表上展示不同时间段的数据&#xff0c;并实现动态切换的效果。 简介原理&#xff1a;在 timeline 中定义显示节点并与相应的数据结构绑定&#xff0c;然后调用 ECharts 提供的方法&#xff0c;重新渲染图表。 …