SpringBoot : ch04 整合数据源

前言

Spring Boot 是当今最流行的 Java 开发框架之一,它以简洁、高效的特点帮助开发者快速构建稳健的应用程序。在实际项目中,涉及到数据库操作的需求时,我们需要对数据源进行整合。本文将重点介绍如何在 Spring Boot 中整合数据源,以及如何利用 Spring Boot 的便利特性来简化这一过程。

无论是传统的关系型数据库,还是当下流行的 NoSQL 数据库,Spring Boot 都提供了丰富的支持。通过本文的学习,读者将能够掌握在 Spring Boot 中整合各类数据源的方法,并且了解如何利用 Spring Boot 的自动配置和简化的注解来简化数据源配置工作,从而更专注于应用程序的业务逻辑开发。

如果你对 Spring Boot 中数据源整合的方法感到困惑,或者希望了解如何通过 Spring Boot 来更高效地处理数据库操作,那么本文将为你提供宝贵的指导和实用的技巧。让我们一起深入探索 Spring Boot 中数据源整合的精彩世界吧!

一、前期准备

1、新建项目,结构如下

2、导入依赖
<dependencies><!-- spring boot 的核心starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- spring jdbc 的 starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!-- Druid 连接池的 starter --><!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.18</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><image><builder>paketobuildpacks/builder-jammy-base:latest</builder></image></configuration></plugin></plugins></build>

 这是一个关于 Spring Boot 整合数据源的 Maven 依赖配置和构建插件示例。这些依赖项将帮助你在项目中使用 Spring Boot 和相关的数据库连接池进行数据源整合。以下是示例中包含的依赖项和插件说明:

  • spring-boot-starter:Spring Boot 的核心依赖,提供了基本的 Spring Boot 功能。
  • spring-boot-starter-jdbc:Spring Boot 的 JDBC Starter,用于支持 JDBC 数据库操作。
  • lombok:Java 开发工具,简化了代码编写过程。
  • druid-spring-boot-starter:Druid 连接池的 Spring Boot Starter,用于管理数据库连接。
  • mysql-connector-j:MySQL 数据库的 JDBC 驱动。
  • spring-boot-starter-test:Spring Boot 的测试 Starter,用于编写单元测试。

在构建部分,示例使用了 spring-boot-maven-plugin 插件来配置 Docker 镜像构建时所使用的镜像构建器。

二、使用 yml  配置SpringBoot 内置的 hikari 连接池

# 数据源连接池
spring:datasource:# 连接属性driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/psmusername: rootpassword: 123456# SpringBoot 内置的 hikari 连接池hikari:# 最小空闲连接minimum-idle: 5# 最大连接数maximum-pool-size: 20# 最大空闲时长idle-timeout: 900000# 连接的超时时间connection-timeout: 3000# 检查连接的有效性connection-test-query: select 1
  • driver-class-name:指定 JDBC 驱动类的完整类名,用于连接数据库。在示例中,我们使用了 MySQL 的驱动类 com.mysql.cj.jdbc.Driver
  • url:指定数据库的连接 URL。在示例中,我们连接的是本地的 MySQL 数据库,监听端口为 3306,数据库名称为 psm
  • username 和 password:指定连接数据库所需的用户名和密码。

接下来,我们配置了 Spring Boot 内置的 HikariCP 连接池相关的属性:

  • minimum-idle:指定连接池中最小空闲连接数。在示例中,我们设置为 5,表示连接池中至少保持 5 个空闲连接。
  • maximum-pool-size:指定连接池中的最大连接数。在示例中,我们设置为 20,表示连接池中最多可以拥有 20 个连接。
  • idle-timeout:指定连接的最大空闲时长,超过该时长的空闲连接将被释放。在示例中,我们设置为 900000 毫秒(15 分钟)。
  • connection-timeout:指定连接的超时时间,即获取连接的最大等待时间。
  • connection-test-query:这里可以指定一个用于测试连接是否有效的SQL查询语句,比如select 1。连接池会定期执行这个查询来检测连接的有效性。 

1、测试一下
@Slf4j
@SpringBootTest
class Ch04ApplicationTests {@Autowiredprivate DataSource dataSource;@Testvoid contextLoads() throws SQLException {Connection connection = dataSource.getConnection();log.info("连接对象:" + connection);}
}

 这是一个简单的Junit测试类,用来验证你在Spring Boot应用中配置数据源连接池是否成功。以下是这个测试类的详细说明:

  • @Slf4j注解:这个注解会自动生成一个名为log的日志对象,用来输出日志信息。

  • @SpringBootTest注解:这个注解告诉JUnit测试框架,需要加载整个Spring应用上下文来执行测试。

  • @Autowired注解:这个注解用来自动装配数据源连接池对象,也就是在Spring容器中查找一个数据源对象并将其注入到dataSource变量中。

  • contextLoads()方法:这个方法是一个测试用例,用来测试数据源连接池是否正常工作。在这个方法中,你调用了dataSource.getConnection()方法获取一个数据库连接,并使用log.info()方法输出这个连接对象。

当你运行这个测试类时,如果能够正常输出连接对象,就说明你已经成功地配置了数据源连接池,并且能够使用它来管理数据库连接了。

运行结果:

 

三、使用 yml 配置 druid 连接池

# 数据源连接池
spring:datasource:# 连接属性driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/psmusername: rootpassword: 123456# 使用 druid 连接池druid:# 最大连接数max-active: 100# 初始化连接数initial-size: 10# 最小连接池数min-idle: 10# 最大等待时间max-wait: 1000# 如果连接空闲时间大于等于( min-evictable-idle-time-millis)# 的时长则关闭连接time-between-eviction-runs-millis: 60000# 连接保持空闲而不被驱逐出连接池min-evictable-idle-time-millis: 300000# 检查连接有效性validation-query: select 1# 是否缓存 preparedStatement (MySQL 建议关闭)pool-prepared-statements: false

以下是一些重要的设置说明:

  • driver-class-nameurlusernamepassword:这些属性指定了数据库连接的基本信息,包括驱动类名、数据库URL、用户名和密码。

  • druid.max-active:这个属性指定了连接池中允许的最大活动连接数,即最大连接池大小。

  • druid.initial-size:这个属性指定了连接池的初始大小,即在连接池刚刚创建时,连接池中包含的连接数。

  • druid.min-idle:这个属性指定了连接池中保持的最小空闲连接数。

  • druid.max-wait:当连接池中没有可用连接时,客户端在等待连接时最长的时间,单位为毫秒。

  • druid.time-between-eviction-runs-millis:用于检测连接池中空闲连接的时间间隔,单位为毫秒。如果连接空闲时间大于等于min-evictable-idle-time-millis的时长,则关闭连接。

  • druid.min-evictable-idle-time-millis:连接保持空闲而不被驱逐出连接池的时长,单位为毫秒。

  • druid.validation-query:用来检测连接是否有效的SQL查询语句,例如select 1

  • druid.pool-prepared-statements:是否缓存prepared statements,对于MySQL数据库,建议将此属性设置为false。

 1、测试一下
@Slf4j
@SpringBootTest
class Ch04ApplicationTests {@Autowiredprivate DataSource dataSource;/*** 注入 JDBC 的 Template,用于操作数据*/@Autowiredprivate JdbcTemplate template;@Testvoid contextLoads() throws SQLException {Connection connection = dataSource.getConnection();log.info("连接对象:" + connection);}@Testpublic void testJdbcTemplate(){List<Map<String, Object>> list = template.queryForList("select * from psm.city_info limit 0,10");list.forEach(map -> map.forEach((k,v) -> {log.info("键:" + k +"  " + "值:" + v);}) );}}

这段代码是一个Spring Boot的测试类,用于测试数据源和JdbcTemplate是否能够正常工作。

首先,在@Autowired注解下,DataSource对象被注入到测试类中。这个数据源对象可以用来获取数据库连接,在contextLoads方法中,通过调用dataSource.getConnection()方法获得了一个数据库连接对象,然后在日志中记录了这个连接对象。

另外,在testJdbcTemplate方法中,可以看到JdbcTemplate对象也被注入到测试类中。JdbcTemplate是Spring框架提供的一个用于简化JDBC操作的工具类,可以用它来执行SQL查询、更新等操作。在这个方法中,使用了template.queryForList方法查询了psm.city_info表的前10行数据,并打印出了每一行数据中的键值对。

通过这些测试,可以验证数据源和JdbcTemplate是否已经正确配置和注入到Spring容器中,以及它们是否能够正常地连接和操作数据库。如果测试通过,则说明你已经成功地配置了数据源和JdbcTemplate,并能够使用它们来操作数据库。

运行结果:

 

四、hikari 和Druid的区别

Hikari和Druid都是Java语言中常用的数据库连接池。它们之间的不同主要体现在以下几个方面:

  1. 性能和效率: HikariCP通常被认为是性能最好的连接池之一,因为它专注于快速、轻量级和高效的连接管理。相比之下,Druid虽然功能强大,但在某些情况下可能会牺牲一些性能以换取更多的特性和功能。

  2. 配置和简洁性: HikariCP的配置相对简单,通常只需要很少的参数设置就可以工作良好。而Druid提供了更多的配置选项和功能,这使得它在一些复杂的场景下更具灵活性,但也增加了学习和配置的复杂性。

  3. 监控和扩展性: Druid内置了丰富的监控和统计功能,可以方便地查看连接池的状态和性能指标。此外,Druid还提供了诸如防火墙、SQL转义等额外的功能,这些功能在HikariCP中可能需要额外的集成或扩展。

综上所述,HikariCP适合那些追求高性能、简洁配置的场景,而Druid则适合那些对监控和扩展性有较高要求的场景。选择哪个连接池取决于具体的项目需求和性能考量。

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

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

相关文章

NX二次开发UF_CAM_PREF_ask_integer_value 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CAM_PREF_ask_integer_value Defined in: uf_cam_prefs.h int UF_CAM_PREF_ask_integer_value(UF_CAM_PREF_t pref, int * value ) overview 概述 This function provides the …

如何看待程序员领域内的“内卷”现象?

要搞清楚这个问题&#xff0c;我首先就来阐释一下“内卷”的概念。 内卷本身是从一个学术名词演化为网络流行词的&#xff0c;本是指文化模式因达到某种最终形态&#xff0c;既无法保持稳定也不能转化为更高级的新形态&#xff0c;而只能在这种文化模式内部无限变得复杂的现象。…

TVS瞬态抑制二极管的工作原理和特点?|深圳比创达电子EMC

TVS二极管一般是用来防止端口瞬间的电压冲击造成后级电路的损坏。防止端口瞬间的电压冲击造成后级电路的损坏。有单向与双向之分&#xff0c;单向TVS一般应用于直流供电电路&#xff0c;双向TVS应用于交流供电电路。 TVS产品的额定瞬态功率应大于电路中可能出现的最大瞬态浪涌…

层层剥开Android14升级后异常弹框的神秘面纱

本篇文章将会通过研究源码的方式给您讲述Android系统升级到Android14后出现的两个异常弹框并给出消除它们的方案。闲话少叙&#xff0c;我们开始。 问题描述 在Android 14升级后&#xff0c;出现两个弹窗的异常情况。这里是异常的截图&#xff1a; 接下来&#xff0c;我们对这…

第一个Maven项目

&#xff08;一&#xff09;准备工作 1、从官网下载压缩包&#xff1a;apache-maven-3.5.4-bin&#xff0c;然后解压到D盘没有中文的目录。 2、配置环境变量: 在左下角win打开“设置”&#xff0c;搜索“高级系统设置”&#xff0c;点击“高级”&#xff0c;点击“环境变量”&…

酷开科技OS——Coolita,让智能大屏走向国际

10月23日&#xff0c;2023中国—东盟视听传播论坛在南宁举行。作为第五届中国—东盟视听周重要活动之一&#xff0c;本次论坛以“共享新成果、共创新视听、共建新家园”为主题。来自中国和东盟的300余名专家学者、业界代表通过主旨演讲、主题发言、圆桌对话等方式进行深入探讨&…

自学成为android framework高手需要准备哪些装备-千里马车载车机系统开发学习

背景 hi&#xff0c;粉丝朋友们&#xff1a; 大家好&#xff01;经常有很多学员买课同学都会问到需要准备哪些装备&#xff0c;我也回答了很多学员了&#xff0c;今天就搞一篇文章来统一说明一下&#xff0c;告诉一下大家如果你想从一个framework新手变成一个framework开发的高…

振弦传感器土压力计的安装及埋设方法

振弦传感器土压力计的安装及埋设方法 土压力计是一种测量土体内侧压力的仪器&#xff0c;常用于土体工程的安全监测和评估。以下是土压力计的安装及埋设方法&#xff1a; 1. 选择合适的位置&#xff1a;土压力计的安装位置应该在土体内的高应力区域&#xff0c;以便能够准确测…

在Linux服务器中查找mysql的配置文件并修改其内容并保存,清空mysql8.0以上默认开启SSL的配置,防止odbc无法连接的问题

------每个命令输完记得按【enter】回车键------- 1、查找mysql的配置文件命令-mysql的配置文件默认名是my.cnf&#xff1a; find / -name my.cnf 2、查看显示的配置文件内容&#xff1a; cat /etc/my.cnf 3、修改配置文件的内容&#xff1a; 使用vi 或vim 命令 vi /etc…

推荐系统概述(PPT)

参考资料&#xff1a; 推荐系统系列之推荐系统概览&#xff08;上&#xff09; | 亚马逊AWS官方博客推荐系统系列之推荐系统概览&#xff08;下&#xff09; | 亚马逊AWS官方博客 目录如下&#xff1a; 推荐系统简介 推荐系统中常见概念 推荐系统中常用的评价指标 首页推荐…

请求的接口响应状态为已取消的原因

有趣的iframe问题 今天遇到一个问题&#xff0c;当点击了按钮----跳转页面时----F12键点击网络中的状态报了已取消&#xff0c;类型是 document说明是前端页面的问题&#xff0c;如果是xhr那可能是接口的问题。 原本是写了3个iframe,页面刷新的时候请求了第一个iframe,然后就…

随机微分方程的MATLAB数值求解

dt0.01; tout200; %总时间为2 xzeros(1,tout); x(1)0.5; %初始位置 mu0.2; sigma1; Wtsqrt(dt)*randn(1,tout); %产生随机序列Wt for t1:tout-1x(t1)x(t)mu*x(t)*dtsigma*x(t)*Wt(t); end t11:10:tout; %对原时间序列进行抽样 xtzeros(1,length(t1)); i1; for tt1xt(i)0.5*exp(…

招投标系统软件源码,招投标全流程在线化管理

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…

HUAWEI华为MateBook X Pro 2022 12代酷睿版(MRGF-16)笔记本电脑原装出厂Windows11系统工厂模式含F10还原

链接&#xff1a;https://pan.baidu.com/s/1ZI5mR6SOgFzMljbMym7u3A?pwdl2cu 提取码&#xff1a;l2cu 华为原厂Windows11系统工厂包&#xff0c;带F10一键智能还原恢复功能。 自带指纹、面部识别、声卡、网卡、显卡、蓝牙等所有驱动、出厂主题壁纸、Office办公软件、华为…

深信服AC跨三层取mac,绑定ip/mac

拓扑图 目录 拓扑图 1.交换机配置团体名和版本号 2.配置跨三层取mac 3.配置策略 验证&#xff1a; “您的每一次阅读、点赞和分享&#xff0c;都是对我最大的鼓舞和动力。” 如果对亲爱您有所帮助&#xff0c;可以尝试支持一下博主&#xff0c;让博主更有动力 1.交换机配置…

Docker上部署mysql(超简单!!!)

拉取mysql镜像 运行如下命令 docker pull mysql:5.7 拉取成功 查看镜像 运行容器 此处部署最新版本的mysql docker run -d --name mysql -p 3307:3306 -e TZAsia/Shanghai -e MYSQL_ROOT_PASSWORD111 mysql --name mysql&#xff1a;给容器起个名字&#xff08;唯一&#xff…

bclinux aarch64 openeuler 20.03 LTS SP1 部署 fastCFS

基于已配置好的4个节点部署ceph-0 ceph-1 ceph-2 ceph-3&#xff08;早期ceph测试环境&#xff0c;名称就不修改了&#xff09; 获取fcfs.sh mkdir /etc/fcfs cd /etc/fcfs wget http://fastcfs.net/fastcfs/ops/fcfs.sh 配置/etc/fcfs/fcfs.settings # 要安装的集群版本号…

Linux 零拷贝splice函数

Linux splice 函数简介 splice 是 Linux 系统中用于在两个文件描述符之间移动数据的系统调用。它的主要作用是在两个文件描述符之间传输数据&#xff0c;而无需在用户空间进行数据拷贝。也是零拷贝操作. 函数原型 #include <fcntl.h> ssize_t splice(int fd_in, loff_…

Python 2.7 在 Debian 服务器上获取 URL 时的 SSL 验证失败问题与解决方案

在使用Python的requests库从Debian稳定服务器上获取简单URL时&#xff0c;遇到了SSL证书错误。 根据用户的问题描述&#xff0c;您遇到了SSL证书验证失败的问题。 要解决这个问题&#xff0c;您可以采取以下步骤&#xff1a; 1. 升级到Python 2.7的最新版本&#xff1a; 首…

关于sklearn的:还可能是网络的问题???

前提&#xff1a;安装sklearn需要 numpy、scipy等库&#xff08;这个自行搜索&#xff09; 昨天安装numpy、scipy很快&#xff0c;一会就好了&#xff0c;然后安装sklearn一直报错&#xff0c;还以为是版本问题。 今天大早上起来&#xff0c;再次安装&#xff0c;顺利成功&…