SpringBoot : ch04 整合数据源

news2024/11/24 20:45:28

前言

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

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

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

相关文章

实时云渲染 助力破解智慧园区痛点困局

智慧园区是运用先进的信息技术&#xff0c;如物联网&#xff08;IoT&#xff09;、大数据、云计算、人工智能、三维可视化等&#xff0c;对园区内的各类设施、资源以及管理进行智能化和数字化升级。其目标是通过科技手段提升园区的运营效率、资源利用率&#xff0c;提供更便捷、…

循环神经网络(RNN)实现股票预测

文章目录 一、前言二、前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;2. 导入数据 四、数据预处理1.归一化2.设置测试集训练集 五、构建模型六、激活模型七、训练模型八、结果可视化1.绘制loss图2.预测3.评估 一、前言 我的环境&#xff1a; 语言环…

防雷接地+防雷工程施工综合方案

一、地凯科技防雷工程接地概述 防雷接地工程是指在建筑物或其他设施上安装防雷装置&#xff0c;以防止雷电对人员、设备和建筑物造成危害的工程。防雷装置主要包括避雷针&#xff08;网&#xff09;、引下线、接地体&#xff08;网&#xff09;等部分&#xff0c;其中接地体&a…

Zookeeper初识及安装配置

文章目录 写在前面一、Zookeeper概念二、下载安装2.1 环境准备2.2 下载上传2.3 解压 三、配置启动3.1 配置zoo.cfg3.2 启动Zookeeper 写在前面 最近接受了一个比较老的分布式项目&#xff0c;用的Zookeeper协调服务&#xff0c;所以虽然相关的服务注册等功能有很多可能更好的代…

技术分享|电商数据接口|淘宝天猫京东商品API接口之数据同步

常见的数据同步/集成场景多发生于不同的存储系统、不同的存储格式&#xff0c;如从 mysql 同步数据至数仓、excel 或 csv 导入数据库中&#xff0c;但是众多数据同步解决方案很少涉及从 http 接口同步数据。 如淘宝、拼多多等电商平台&#xff0c;平台内部不同团队之间的数据打…

4.3、Linux进程(2)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 通过系统调用创建进程--fork函数 结果是什么呢&#xff1f; 为什么会出来三个打印呢? 就是因为父进程调用了fork函数创建出了子进程的task_struct,但是一个进程不止task_struct&#xff0c;还有代码和数据&#xff0c;他们…

JVM基础- 垃圾回收器

基本介绍 Java虚拟机&#xff08;JVM&#xff09;中的垃圾回收器是用来自动管理内存的关键组件。它负责识别并回收不再使用的内存&#xff0c;从而防止内存泄漏。不同的JVM实现提供了多种垃圾回收器&#xff0c;每种回收器都有其特定的使用场景和性能特点。以下是一些常见的JV…

Rust生态系统:探索常用的库和框架

大家好&#xff01;我是lincyang。 今天我们来探索Rust的生态系统&#xff0c;特别是其中的一些常用库和框架。 Rust生态系统虽然相比于一些更成熟的语言还在成长阶段&#xff0c;但已经有很多强大的工具和库支持各种应用的开发。 常用的Rust库和框架 Serde&#xff1a;一个…

Tesco EDI需求分析

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

51单片机LED灯渐明渐暗实验

51单片机LED灯渐明渐暗实验 1.概述 这篇文章介绍使用单片机控制两个LED彩灯亮度渐明渐暗效果&#xff0c;详细介绍了操作步骤以及完整的程序代码&#xff0c;动手就能制作的小实验。 2.操作步骤 2.1.硬件搭建 1.硬件准备 名称型号数量单片机STC12C2052AD1LED彩灯无2晶振1…

抖音预约服务小程序开发:前端与后端技术的完美融合

开发抖音预约服务小程序成为了一种有趣而又实用的尝试。本篇文章&#xff0c;小编会与大家共同探讨抖音预约服务小程序开发的前端与后端技术融合的关键要点。 一、前端技术选择与设计 1.小程序框架 开发抖音预约服务小程序的前端&#xff0c;首先需要选择一个适用的小程序框…

系统试运行方案

系统试运行的目的&#xff1a; 试运行目的通过既定时间段的试运行&#xff0c;全面考察项目建设成果。并通过试运行发现项目存在的问题&#xff0c;从而进一步完善项目建设内容&#xff0c;确保项目顺利通过竣工验收并平稳地移交给运行管理单位。通过实际运行中系统功能与性能的…

系列三、ThreadLocal vs synchronized

一、ThreadLocal vs synchronized 虽然ThreadLocal与synchronized关键字都能用于处理多线程并发访问变量的问题&#xff0c;但是两者处理问题的角度和思路是不一样的。区别如下&#xff1a; 小总结&#xff1a;虽然上一篇中的案例都实现了线程隔离&#xff0c;但是使用ThreadLo…

计算机网络之概述

一、概述 1.1因特网概述 定义 网络(Network)由若干结点(Node)和连接这些结点的链路(Link)组成。多个网络还可以通过路由器互连起来&#xff0c;这样就构成了一个覆盖范围更大的网络&#xff0c;即互联网&#xff08;或互连网&#xff09;因此&#xff0c;互联网是“网络的网络…

【C++】类与对象(中)

一、类的默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器会自…

最新红盟云卡个人自动发卡开源系统源码+全开源无加密+虚拟商品在线售卖平台

源码简介&#xff1a; 最新红盟云卡个人自动发卡开源系统源码全开源无加密虚拟商品在线售卖平台&#xff0c;支持多个接口的个人免签功能。 红盟云卡系统是一款基于PHP和MySQL开发的虚拟商品在线售卖平台。它具备美观且功能丰富的发卡网站特性&#xff0c;并可与社区进行无缝…

微信小程序点击图片放大预览,新页面中全屏预览图片

第一步&#xff1a;在wxml中定义image组件&#xff0c;并设置绑定事件。 <image src"{{priceUrl}}" bindtap"imgClick"></image>第二步&#xff1a;在js中设置需要预览图片的URL数组&#xff0c;切记一定要是数组&#xff0c;即使一张图也要是…

排序算法--插入排序

实现逻辑 ① 从第一个元素开始&#xff0c;该元素可以认为已经被排序 ② 取出下一个元素&#xff0c;在已经排序的元素序列中从后向前扫描 ③如果该元素&#xff08;已排序&#xff09;大于新元素&#xff0c;将该元素移到下一位置 ④ 重复步骤③&#xff0c;直到找到已排序的元…

DataFunSummit:2023年智能风控技术峰会-核心PPT资料下载

一、峰会简介 智能风控的技术体系涉及多个方面&#xff0c;包括数据架构、数据类型、风控算法、团队建设等。随着风控事件发生愈发频繁和规模化&#xff0c;风控数据架构将持续优化具有高并发、高吞吐特点的实时计算场景&#xff0c;带来更加及时的响应。 由于风控事件以人与…