【微服务~原始真解】Spring Cloud —— 访问数据库整合Druid数据源

🔎这里是【秒懂·云原生】,关注我学习云原生不迷路
👍如果对你有帮助,给博主一个免费的点赞以示鼓励
欢迎各位🔎点赞👍评论收藏⭐️
👀专栏介绍
【秒懂·云原生】 目前主要更新微服务,一起学习一起进步。
👀本期介绍
主要介绍Spring Cloud —— 访问数据库整合Druid数据源
文章目录
- 👀专栏介绍
- 👀本期介绍
- Spring Boot JDBC访问数据库
- 引入JDBC启动器
- 数据库驱动
- 配置数据源
- 测试
- Spring Boot整合Druid数据源
- 引入 Druid Spring Boot Starter 依赖
- 配置属性
- 配置类
- 结束语🏆🏆🏆
Spring Boot JDBC访问数据库
对于数据访问层,无论是 SQL(关系型数据库) 还是 NOSQL(非关系型数据库),Spring Boot 都默认采用整合 Spring Data 的方式进行统一处理,通过大量自动配置,来简化我们对数据访问层的操作,我们只需要进行简单的设置即可实现对书层的访问。
引入JDBC启动器
<!--导入JDBC的启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
数据库驱动
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
配置数据源
这里填自己数据库的信息
#数据源连接信息
spring: datasource: username: root password: root url: jdbc:mysql://localhost:3306/dbdriver-class-name: com.mysql.cj.jdbc.Driver
测试
Spring Boot 提供了一个名为 JdbcTemplate 的轻量级数据访问工具,它是对 JDBC 的封装。Spring Boot 对 JdbcTemplate 提供了默认自动配置,我们可以直接使用 @Autowired 或构造函数将它注入到 bean 中使用。
Spring Boot整合Druid数据源
Druid 是阿里巴巴推出的一款开源的高性能数据源产品,Druid 支持所有JDBC 兼容的数据库,包括 Oracle、MySQL、SQL Server 和 H2 等等。Druid 不仅结合了 C3P0、DBCP 和 PROXOOL 等数据源产品的优点,同时还加入了强大的监控功能。通过 Druid 的监控功能,可以实时观察数据库连接池和 SQL 的运行情况,帮助用户及时排查出系统中存在的问题。使用 Druid Spring Boot Starter 将 Druid 与 Spring Boot 整合
引入 Druid Spring Boot Starter 依赖
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId> <version>1.2.9</version> </dependency>
配置属性
#数据库连接信息配置
spring: datasource: driver-class-name: com.mysql.jdbc.Driver username: root password: root url: jdbc:mysql://localhost:3306/db pools: initial-size: 10 # 初始化时建立物理连接的个数。初始化发生 在显示调用init方法,或者第一次getConnection时 min-idle: 10 # 最小连接池数量 最小空闲数量 maxActive: 200 # 最大连接池数量 最大活跃连接数 maxWait: 60000 # 获取连接时最大等待时间,单位毫秒。配置了 maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置 timeBetweenEvictionRunsMillis: 60000 # 检查空闲连接的 频率.Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于 minEvictableIdleTimeMillis则关闭物理连接。 minEvictableIdleTimeMillis: 300000 # 连接的最小生存时 间.连接保持空闲而不被驱逐的最小时间 validationQuery: SELECT 1 # 验证数据库服务可用性的 sql.用来检测连接是否有效的sql 因数据库方言而差, 例如 oracle 应该写 成 SELECT 1 FROM DUAL testWhileIdle: true # 申请连接时检测空闲时间,根据空闲时 间再检测连接是否有效.建议配置为true,不影响性能,并且保证安全性。申请 连接的时候检测,如果空闲时间大于timeBetweenEvictionRun testOnBorrow: false # 申请连接时直接检测连接是否有效.申 请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性 能。testOnReturn: false # 归还连接时检测连接是否有效.归还连 接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 poolPreparedStatements: true # 开启PSCache maxPoolPreparedStatementPerConnectionSize: 20 #设置 PSCache值connectionErrorRetryAttempts: 3 # 连接出错后再尝试连接 三次 breakAfterAcquireFailure: true # 数据库服务宕机自动重 连机制 timeBetweenConnectErrorMillis: 300000 # 连接出错后重 试时间间隔asyncInit: true # 异步初始化策略 remove-abandoned: true # 是否自动回收超时连接 remove-abandoned-timeout: 1800 # 超时时间(以秒数为单 位) 超过此值后,druid将强制回收该连接 transaction-query-timeout: 6000 # 事务超时时间 filters: stat,wall,log4j2 connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 stat-view-servlet: enabled: true #是否开启内置监控页面,默认值 为 false url-pattern: "/druid/*" #StatViewServlet 的映射 路径,即内置监控页面的访问地址 allow: 127.0.0.1 #白名单 deny: #黑名单 reset-enable: false #是否启用重置按钮 login-username: admin #内置监控页面的登录页用户名 usernamelogin-password: admin #内置监控页面的登录页密码 passwordweb-stat-filter: enabled: true #是否开启内置监控中的 Web- jdbc 关联监控的数据 url-pattern: "/*" #匹配路径 exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*" #排除 路径 session-stat-enable: true #是否监控session
配置类
DruidDataSourceConfig.java
package com.example.demo;import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.sql.DataSource;
import java.sql.SQLException;/*** @author yeqv* @program demo* @Classname DruidDataConfig* @Date 2022/4/29 16:35* @Email w16638771062@163.com*/
@Configuration
@ConfigurationProperties(prefix = "spring.datasource")
@Data
public class DruidDataSourceConfig {@AutowiredDruidStatProperties druidStatProperties;@AutowiredStatFilter statFilter;private String url;private String username;private String password;private String driverClasName;@Beanpublic DataSource dataSource(DruidPools druidPools) throws SQLException {DruidDataSource dataSource = new DruidDataSource();dataSource.setUrl(getUrl());dataSource.setUsername(getUsername());dataSource.setPassword(getPassword());dataSource.setDriverClassName(getDriverClasName());dataSource.setInitialSize(druidPools.getInitialSize());dataSource.setMinIdle(druidPools.getMinIdle());dataSource.setMaxActive(druidPools.getMaxActive());dataSource.setMaxWait(druidPools.getMaxWait());dataSource.setTimeBetweenEvictionRunsMillis(druidPools.getTimeBetweenEvictionRunsMillis());dataSource.setMinEvictableIdleTimeMillis(druidPools.getMinEvictableIdleTimeMillis());dataSource.setValidationQuery(druidPools.getValidationQuery());dataSource.setTestWhileIdle(druidPools.testWhileIdle);dataSource.setTestOnBorrow(druidPools.testOnBorrow);dataSource.setTestOnReturn(druidPools.testOnReturn);dataSource.setPoolPreparedStatements(druidPools.poolPreparedStatements);dataSource.setMaxPoolPreparedStatementPerConnectionSize(druidPools.maxPoolPreparedStatementPerConnectionSize);dataSource.setConnectionErrorRetryAttempts(druidPools.connectionErrorRetryAttempts);dataSource.setBreakAfterAcquireFailure(druidPools.breakAfterAcquireFailure);dataSource.setTimeBetweenConnectErrorMillis(druidPools.timeBetweenConnectErrorMillis);dataSource.setAsyncInit(druidPools.asyncInit);dataSource.setRemoveAbandoned(druidPools.removeAbandoned);dataSource.setRemoveAbandoned(druidPools.removeAbandoned);dataSource.setTransactionQueryTimeout(druidPools.transactionQueryTimeout);dataSource.setFilters(druidPools.filters);dataSource.setConnectProperties(druidPools.connectionProperties);return dataSource;}@Beanpublic ServletRegistrationBean druidServlet(StatConfig statConfig) {ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(); // 现在要进行druid监控的配置处理操作servletRegistrationBean.setServlet(new StatViewServlet());servletRegistrationBean.addUrlMappings(druidStatProperties.getStatViewServlet().getUrlPattern());servletRegistrationBean.addInitParameter("allow", statConfig.getAllow()); // 白名单servletRegistrationBean.addInitParameter("deny", statConfig.getDeny()); // 黑名单servletRegistrationBean.addInitParameter("loginUsername", statConfig.getLoginUsername()); // 用户名servletRegistrationBean.addInitParameter("loginPassword", statConfig.getLoginPassword()); // 密码servletRegistrationBean.addInitParameter("resetEnable", statConfig.getResetEnable()); // 是否可以重置数据源return servletRegistrationBean;}@Beanpublic FilterRegistrationBean filterRegistrationBean(StatFilter statFilter) {FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();filterRegistrationBean.setFilter(new WebStatFilter());filterRegistrationBean.addUrlPatterns(statFilter.urlPattern); // 所有请求进行监控处理filterRegistrationBean.addInitParameter("exclusions", statFilter.exclusions);filterRegistrationBean.setEnabled(statFilter.enabled);return filterRegistrationBean;}
}
StatFilter.java
package com.example.demo;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;/*** @author yeqv* @program demo* @Classname StatFilter* @Date 2022/4/29 16:51* @Email w16638771062@163.com*/
@Configuration
@ConfigurationProperties(prefix = "spring.datasource.web-stat-filter")
@Data
public class StatFilter {boolean enabled;String urlPattern;String exclusions;
}
StatConfig.java
package com.example.demo;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;/*** @author yeqv* @program demo* @Classname StatConfig* @Date 2022/4/29 16:48* @Email w16638771062@163.com*/
@Configuration
@ConfigurationProperties(prefix = "spring.datasource.stat-view-servlet")
@Data
public class StatConfig {String urlPattern;String allow;String deny;String resetEnable;String loginUsername;String loginPassword;}
DruidPools.java
package com.example.demo;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;import java.util.Properties;/*** @author yeqv* @program demo* @Classname DruidPools* @Date 2022/4/29 16:45* @Email w16638771062@163.com*/
@Configuration
@ConfigurationProperties(prefix = "spring.datasource.pools")
@Data
public class DruidPools {int initialSize;int minIdle;int maxActive;int maxWait;long timeBetweenEvictionRunsMillis;long minEvictableIdleTimeMillis;String validationQuery;boolean testWhileIdle;boolean testOnBorrow;boolean testOnReturn;boolean poolPreparedStatements;int maxPoolPreparedStatementPerConnectionSize;int connectionErrorRetryAttempts;boolean breakAfterAcquireFailure;long timeBetweenConnectErrorMillis;boolean asyncInit;boolean removeAbandoned;long removeAbandonedTimeout;int transactionQueryTimeout;String filters;Properties connectionProperties;}

结束语🏆🏆🏆
🔥推荐一款模拟面试、刷题神器网站
点击注册即可
牛客刷题网
1、算法篇(398题):面试必刷100题、算法入门、面试高频榜单
2、SQL篇(82题):快速入门、SQL必知必会、SQL进阶挑战、面试真题
3、大厂笔试真题:字节跳动、美团、百度、腾讯…

相关文章:
【微服务~原始真解】Spring Cloud —— 访问数据库整合Druid数据源
🔎这里是【秒懂云原生】,关注我学习云原生不迷路 👍如果对你有帮助,给博主一个免费的点赞以示鼓励 欢迎各位🔎点赞👍评论收藏⭐️ 👀专栏介绍 【秒懂云原生】 目前主要更新微服务,…...
前端入门必刷题,经典算法—两数之和
优美的前⾔ 年轻的码农哟~ 你是不是⼀直在思考⾃我提升的问题~ 思来想去,决定从算法抓起(单押)~ 拿起⼜放下,经历过多少次放弃(单押 ✖ 2)~ 决定了!这次让我来帮你梳理(单押 ✖ 3&a…...
‘海外/国外‘地区微博签到shu据(正题在第二部分)
最近失眠,研究了项关于weibo爬虫的新功能,种种原因,大家可跳过第一部分的引用直接看第二部分。 内容来源:健康中国、生命时报、央视等 失眠标准一:3个“30分钟” ● 入睡困难,从躺下想睡到睡着间隔…...
Springboot——SB整合Mybatis的CURD(基于注解进行开发)
此处是根据需求实现基本操作 上面这里涉及到了条件分页查询,还有增加和批量删除员工信息,右边编辑就是先查询后更新操作,叫做查询回显,然后在原有基础上进行更新 环境准备 在下面的入门案例的整体环境下把数据库表换成empSpring…...
现在大专生转IT可行吗?
当然可行的。 大专也是人,为什么不可以选择喜欢的专业学习,现在大学生遍地都是,学历已经不是限制你发展的因素了。有的人就是不擅长理论学习,更喜欢技术。IT也只是一个普普通通的技术行业,跟其他技术行业一样…...
XC7A50T-1CSG324I、XC7A50T-2CSG324I Artix-7 FPGA可编程门阵列
Artix-7 FPGA能够在多个方面实现更高的性价比,这些方面包括逻辑、信号处理、嵌入式内存、LVDS I/O、内存接口,以及收发器。MicroBlaze CPU针对Xilinx FPGA进行了优化,是一种可高度配置的32位RISC处理器,可为微控制器、实时处理器和…...
linux安装图片处理软件ImageMagick
下载地址: wget https://download.imagemagick.org/archive/ImageMagick-7.1.1-4.tar.gz 或者 wget --no-check-certificate https://download.imagemagick.org/archive/ImageMagick-7.1.1-4.tar.gz 安装命令: tar -zxvf ImageMagick-7.1.1-4.tar.…...
【Java基础】JavaCore核心-反射技术
文章目录1.什么是反射技术2.反射-获取类对象方式3.反射-获取声明构造器4.反射-对象创建实战5.反射-方法和属性实战6.反射-属性值操作实战7.反射-invoke运行类方法1.什么是反射技术 Java的反射(reflection)机制是指在程序的运行状态中 可以构造任意一个类…...
AWGN后验估计下的均值与协方差关系(向量和标量形式)
文章目录AWGN信道向量模型后验均值与协方差的关系从实数域拓展到复数域小结AWGN信道向量模型 考虑一个随机向量x∼pX(x)\boldsymbol x \sim p_{\boldsymbol X}(\boldsymbol x)x∼pX(x),信道模型为 qxv,v∼N(0,Σ)\boldsymbol q \boldsymbol x \boldsymbol v, \…...
Linux常用命令之文件搜索命令
1、常用搜索-find 命令find英文原意find所在路径/bin/find执行权限所有用户功能描述文件搜索语法find [搜索范围] [搜索条件] (默认准确搜索)范例find /etc -name init?? 常用的搜索条件的选项包括: -name:按照文件名进行匹配查找,例&…...
ChatGPT给软件测试行业带来的可能
软件测试在软件开发过程中扮演着至关重要的角色,因为它可以确保软件的质量和可靠性。而随着人工智能技术的不断发展,ChatGPT作为一个强大的自然语言处理工具,可以在软件测试中发挥出许多重要的作用。本文将介绍ChatGPT在软件测试应用中带来的…...
Cadence Allegro 导出Properties on Nets Report报告详解
⏪《上一篇》 🏡《上级目录》 ⏩《下一篇》 目录 1,概述2,Properties on Nets Report作用3,Properties on Nets Report示例4,Properties on Nets Report导出方法4.1,方法14.2,方法2B站关注“硬小二”浏览更多演示视频...
JAVA代码 实现定位数据动态聚集并绘制多边形区域
文章目录思路1、限制聚合距离2、绘制多边形区域3、多边形区域之间合并4、多边形定边点4、逻辑流程一些性能上的优化1、多边形设置圆心2、采用分支合并思路3、清理聚集较分散区域合理性处理1、解决多边形内凹角问题2、解决定边点插入位置问题3、多边形区域扩展成果展示最近有根据…...
基于储能进行调峰和频率调节研究【超线性增益的联合优化】(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
体验 Linux 的几个监控命令(htop、nmon、netdata)
体验 Linux 的几个监控命令htopnmonnetdatahtop 安装, sudo dnf install -y htop使用, htopnmon 安装, sudo dnf install -y nmon使用, nmon输入c, 输入C, 输入m, 输入n, 输入…...
NOC大赛2022NOC软件创意编程初赛图形化小低组(小学高年级组)
一、选择题 1.如果要控制所有角色一起朝舞台区右侧移动,下面哪个积太块是不需要的 2.要想让三个角色一起移动起来,下面哪个积木块没有作用 ? 3.小猴按照下面的程序前进,小猴最后一次前进了()步。 4.小可同学写了一个画笔程序画出花朵,但是运行后什么都看不到,不可…...
python进行股票收益率计算和风险控制的实现
股票收益率计算和风险控制的实现 在进行股票投资时,计算收益率和进行风险控制是非常重要的。本文将介绍一个与此相关的函数:radio_day_cal()。 radio_day_cal()函数 def radio_day_cal(last_day, sheet_name, df_dict, code_list, new_list):i 0days…...
自从有了这套近4000页的开发文档后,Java面试路上就像开了挂一样
Java是世界最流行的编程语言,也是国内大多数IT公司的主流语言。招聘网站上Java岗位众多,Java工程师似乎不愁找工作。但仔细一看就会发现,Java岗位的招聘薪酬天差地别,人才要求也是五花八门。而在Java工程师求职过程中,…...
Python文件操作
目录 一、文件操作介绍 二、文件的打开和关闭 三、文件的读写 四、文件文件夹相关操作 五、test 一、文件操作介绍 文件 : python中文件是对象 Liunx 文件 : 一切设备都可以看成是文件 磁盘文件 管道 网络Socket 文件属性: 读 写 执行权限 就是把一些存储存放起来&…...
036:cesium加载GPX文件,显示图形
第036个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中加载GPX文件, 显示图形。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共83行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:https:/…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
【深度学习新浪潮】什么是credit assignment problem?
Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...
Ray框架:分布式AI训练与调参实践
Ray框架:分布式AI训练与调参实践 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 Ray框架:分布式AI训练与调参实践摘要引言框架架构解析1. 核心组件设计2. 关键技术实现2.1 动态资源调度2.2 …...
2025年全国I卷数学压轴题解答
第19题第3问: b b b 使得存在 t t t, 对于任意的 x x x, 5 cos x − cos ( 5 x t ) < b 5\cos x-\cos(5xt)<b 5cosx−cos(5xt)<b, 求 b b b 的最小值. 解: b b b 的最小值 b m i n min t max x g ( x , t ) b_{min}\min_{t} \max_{x} g(x,t) bmi…...
Ubuntu 可执行程序自启动方法
使用 autostart(适用于桌面环境) 适用于 GNOME/KDE 桌面环境(如 Ubuntu 图形界面) 1. 创建 .desktop 文件 sudo vi ~/.config/autostart/my_laser.desktop[Desktop Entry] TypeApplication NameMy Laser Program Execbash -c &…...
