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.Driver
    url: jdbc:mysql://localhost:3306/psm
    username: root
    password: 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 {

    @Autowired
    private DataSource dataSource;


    @Test
    void 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.Driver
    url: jdbc:mysql://localhost:3306/psm
    username: root
    password: 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 {

    @Autowired
    private DataSource dataSource;

    /**
     * 注入 JDBC 的 Template,用于操作数据
     */
    @Autowired
    private JdbcTemplate template;

    @Test
    void contextLoads() throws SQLException {

        Connection connection = dataSource.getConnection();
        log.info("连接对象:" + connection);

    }

    @Test
    public 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则适合那些对监控和扩展性有较高要求的场景。选择哪个连接池取决于具体的项目需求和性能考量。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

这是一棵适合搜索二叉树

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;强烈推荐优质专栏: &#x1f354;&#x1f35f;&#x1f32f;C的世界(持续更新中) &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;…

Tesco EDI需求分析

Tesco&#xff0c;成立于1919年&#xff0c;是一家全球领先的综合性零售企业&#xff0c;总部位于英国。公司致力于提供高质量、多样化的商品和服务&#xff0c;以满足客户的需求。Tesco的使命是通过创新和卓越的客户服务&#xff0c;为客户创造更美好的生活。多年来&#xff0…

【带你读懂数据手册】CN3702 一款锂电池充电芯片

大家在学习智能车或者飞行器的时候&#xff0c;是不是外接一个电池&#xff1f;最近刚好学习了一款充电芯片&#xff0c;来和大家分享一下&#xff0c;也算是我的一点点笔记。 一款7.4V锂电池&#xff0c;基本上也满足了单片机的外设&#xff0c;如果需要12V或者24V的电压&…

【前端】前端监控⊆埋点

文章目录 前端监控分为三个方面前端监控流程异常监控常见的错误捕获方法主要是 try / catch 、window.onerror 和window.addEventListener 等。Promise 错误Vue 错误React 错误 性能监控用户行为监控常见的埋点方案来源 前端监控分为三个方面 异常监控&#xff08;监控前端页面…

软件临界资源访问冲突

1. 基础概念 1.1 cpu执行汇编代码 处理指令的步骤主要包括以下几步动作&#xff1a; 1.提取(Fetch)指令。 2.解码(Decode)指令。 3.执行(Execute)指令。 cpu运行一条汇编需要执行三个步骤&#xff0c;按照顺序依次执行。异常触发中断需要等待一条汇编运行完成才能跳转&…

数据库的基本概念以及MySQL基本操作

一、数据库的基本概念 1、数据库的组成 数据&#xff1a;描述事物的符号记录 包括数字&#xff0c;文字、图形、图像、声音、档案记录等 以“记录”形式按统一格式进行存储 表&#xff1a;将不同的记录组织在一起&#xff0c;用来存储具体数据 数据库&#xff1a; 表的集合…

Python 跨文件夹导入自定义包

一、问题再现 有时我们自己编写一些模块时&#xff0c;跨文件夹调用会出现ModuleNotFoundError: No module named XXX 二、解决方案 只需要在下层文件夹中的__init__.py文件中&#xff0c;添加如下代码即可&#xff1a; import sys from os import path sys.path.append(pa…

万字解析设计模式之 适配器模式

一、 适配器模式 1.1概述 将一个接口转换成客户希望的另一个接口&#xff0c;适配器模式使接口不兼容的那些类可以一起工作。 适配器模式分为类适配器模式和对象适配器模式&#xff0c;前者类之间的耦合度比后者高&#xff0c;且要求程序员了解现有组件库中的相关组件的内部结…

imx VPU解码分析4-wrap与hantro的关系

前面已经分析了wrap和hantro&#xff0c;但是二者是如何结合的&#xff0c;wrap是如何封装hantro的&#xff0c;提供了哪些接口&#xff0c;封装了哪些细节还不太清楚&#xff0c;此文来探究下。这里还是只关注解码。 imx VPU解码分析1-wrap-CSDN博客 imx VPU解码分析2-hantr…

值得收藏推荐的 21 款免费数据恢复软件工具

使用这些免费数据恢复工具 之一找回您认为永远消失的文件。我根据这些程序的易用性和提供的功能对这些程序进行了排名。 这些应用程序从您的硬盘驱动器、USB 驱动器、媒体卡等恢复文档、视频、图像、音乐等。我建议每个计算机所有者安装其中一个程序&#xff0c;最好尽快&#…

【MySQL】一些内置函数(时间函数、字符串函数、数学函数等,学会了有妙用)

内置函数 前言正式开始时间函数显示当前日期、时间、日期时间的日期计算相差多少天示例创建一张表&#xff0c;记录生日 留言表 字符串函数charsetconcatinstr(string, substring)ucase和lcaseleft(string, length)length求字符串长度replace(str, search_str, replace_str)tri…

【LeetCode刷题笔记】DFSBFS(一)

51. N 皇后 解题思路: DFS + 回溯 :由于 NxN 个格子放 N 个皇后, 同一行不能放置 2 个皇后,所以皇后必然放置在不同行 。 因此,可以从第 0 行开始,逐行地尝试,在每一个 i

Pyside6/PyQt6的QTreeWidget如何添加多级子项,如何实现选中父项,子项也全部选中功能,源码示例

文章目录 📖 介绍 📖🏡 环境 🏡📒 使用方法 📒📝 数据📝 源码📖 介绍 📖 在UI开发中经常会需要展示/让用户多层级选择,这篇文章记录了一个QTreeWidget如何添加多级子项,如何实现选中父项,子项也全部选中/取消选中功能的源码示例,大家可以举一反三实现自…

合理运用ChatGPT使用Python编写一个桌面便签应用

ChatGPT的编程能力也不差&#xff0c;本次我就一步一步提要求&#xff0c;让ChatGPT根据我的要求&#xff0c;编写出一个可用的&#xff0c;可打包运行的桌面便签。 代码 import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QMenu, QAction, QSystemTrayIco…

php一句话木马免杀

php一句话木马免杀 针对于php一句话木马做免杀&#xff1a; 利用php动态函数的特性&#xff0c;将危险函数拆分成字符&#xff0c;最终使用字符串拼接的方式&#xff0c;然后重新拼接&#xff0c;后加括号执行代码&#xff0c;并且可以使用花指令进行包装&#xff0c;如无限i…

Unity收费对谁影响最大

Unity的收费政策对以下几类人群影响最大&#xff1a; 游戏开发商&#xff1a;Unity收费政策中最直接的影响对象就是游戏开发商。对于那些使用Unity引擎制作游戏的开发商来说&#xff0c;他们将需要考虑新的许可证费用和服务费用&#xff0c;这可能会对他们的盈利和发展产生影响…

springboot项目基于jdk17、分布式事务seata-server-1.7.1、分库分表shardingSphere5.2.1开发过程中出现的问题

由于项目需要&#xff0c;springboot项目需基于jdk17环境开发&#xff0c;结合nacos2.0.3、分布式事务seata-server-1.7.1、分库分表shardingSphere5.2.1等&#xff0c;项目启动过程中出现的问题解决方式小结。 问题一&#xff1a; Caused by: java.lang.RuntimeException: j…

C++ LibCurl实现Web指纹识别

Web指纹识别是一种通过分析Web应用程序的特征和元数据&#xff0c;以确定应用程序所使用的技术栈和配置的技术。这项技术旨在识别Web服务器、Web应用框架、后端数据库、JavaScript库等组件的版本和配置信息。通过分析HTTP响应头、HTML源代码、JavaScript代码、CSS文件等&#x…

【Mysql系列】LAG与LEAD开窗函数

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

visionOS空间计算实战开发教程Day 5 纹理和材质

在​​Day 4​​​中我们使用了​​ImmersiveSpace​​并在其中添加了一个立方体&#xff0c;但对这个立方体我们只配置了长宽高&#xff0c;并没有做进一步的操作。 本文中我们会通过纹理和材质对这个立方体的六个面分别进行不同的绘制。首先我们将​​ImmersiveView​​分拆…