SpringBoot基础概念介绍-数据源与数据库连接池

🙋大家好!我是毛毛张!
🌈个人首页: 神马都会亿点点的毛毛张

毛毛张今天介绍的SpringBoot中的基础概念-数据源与数据库连接池,同时介绍SpringBoot整合两种连接池的教程

文章目录

  • 1 数据库与数据库管理系统
  • 2 JDBC与数据库驱动
    • 2.1 JDBC
    • 2.2 数据库驱动
  • 3 数据库连接池
    • 3.1 什么是数据库连接池
    • 3.2 常见数据库连接池介绍
    • 3.3 常见数据库连接池对比
    • 3.4 总结
  • 4 数据源
    • 4.1 数据源
    • 4.2 数据库连接池与数据源的关系
  • 5 承上启下

1 数据库与数据库管理系统

  • 数据库:英文名是DataBase,简称DB它是存储和管理数据的仓库,数据在数据库中是有组织的进行存储。虽然我们通常会将MySQLOraclePostgreSQL等软件称为数据库,但它们实际上是一种可以操作和管理数据库的软件,而真正的数据库是指存储数据的仓库
  • 数据库管理系统:英文名是DataBase Management System,简称DBMS,它是管理数据库的大型软件。我们平时所说的MySQL数据库本质是MySQL数据库管理系统,在电脑上安装了数据库管理系统后,就可以通过数据库管理系统创建数据库来存储数据,也可以通过该系统对数据库中的数据进行数据的增删改查相关的操作。
    MySQL

2 JDBC与数据库驱动

2.1 JDBC

  • JDBC:英文全称 Java Database Connectivity,中文名称为Java 数据库连接,是 Java 提供的一组用于操作关系型数据库的标准API;它是 由Java官方(Sun 公司)制定的一种规范,旨在提供一种独立于具体数据库的统一接口,简化 Java 程序与数据库之间的交互;通过这种设计,Java程序只需要面向 JDBC规范开发,而具体与数据库的通信细节由厂商提供的驱动程序实现。这种模式允许开发者使用同一套代码切换不同的关系型数据库,只需更换相应的驱动程序。

  • 为什么需要JDBC?

    • 在 Java 开发中,程序需要与关系型数据库(如 MySQL、Oracle 等)进行交互。然而,不同数据库的实现方式和底层细节各不相同。例如,同样的一段 Java 代码可能无法同时操作MySQLOracle数据库。如果开发阶段使用的是 MySQL,而上线后公司选择了 Oracle 数据库,就需要对大量代码进行修改,这将带来巨大的工作量和维护成本。为了避免这种问题,Java 官方定义了一套标准接口——JDBC。这套接口规范化了操作关系型数据库的规则,使开发者无需关注底层实现细节,只需遵循统一的 API 即可,这大大提高了代码的可移植性和灵活性。
  • JDBC核心思想是将规范与实现分离:

    • JDBC 接口(规范):Java 官方提供一组标准的接口,定义了与数据库交互的规则,例如连接数据库、执行 SQL 查询、获取结果等。
    • 数据库驱动(实现):各个数据库厂商根据 JDBC 规范提供具体的实现类,并将这些实现类封装成 .jar 文件,这就是我们常说的 数据库驱动包
  • 应用程序使用JDBC访问数据的方式如下图所示:
    image-20250124211219222)

2.2 数据库驱动

  • 数据库驱动是由不同数据库厂商(如 Oracle、MySQL 等)为特定开发语言(如 Java)提供的程序,用于实现统一的数据库调用。它相当于一个“翻译器”,将 Java 等语言的数据库操作请求翻译成具体数据库能够理解的专属语言,从而实现程序与数据库之间的通信。数据库驱动是基于统一的接口规范(如 JDBC)开发的,直接负责与数据库交互,完成连接、操作和数据传输等任务。
  • 在实际使用中,数据库驱动通常以 驱动包 的形式提供,例如 MySQL 的 mysql-connector-java.jar 或 Oracle 的 ojdbc.jar。开发者只需将驱动包导入项目,配置数据库连接信息(如地址、用户名和密码),即可通过标准接口与数据库交互,完成高效的数据库操作。

3 数据库连接池

3.1 什么是数据库连接池

  • 数据库连接池(Database Connection Pooling)是一种用于高效管理和复用数据库连接的技术,旨在解决传统 JDBC 操作中频繁创建和销毁连接所带来的资源浪费和性能开销问题。在传统的数据库操作中,每次访问数据库都需要加载驱动、建立连接、执行操作和关闭连接,尽管在低频访问场景下,这种方式影响较小,但在高频数据库访问中,频繁的连接创建和销毁会消耗大量的 CPU、内存和网络资源,同时增加操作的延迟,严重时甚至会导致系统崩溃。
  • 数据库连接池通过池化技术,在应用程序启动时预先创建一定数量的数据库连接对象,并将其存储在池中;应用程序需要数据库连接时,可以直接从池中获取,操作完成后将连接归还,而不是每次都重新建立一个新的连接;这样,不仅能够避免频繁创建和销毁连接的高开销,还能大幅提升系统的性能和并发处理能力。
  • 数据库连接池通常由连接管理器连接对象连接池组成。通过对连接池的参数配置,如初始连接数、最小连接数、最大连接数、最大空闲时间等,应用程序能够灵活控制数据库连接的使用,防止连接数过多导致系统资源耗尽,同时确保数据库访问的效率和稳定性。简而言之,数据库连接池的核心作用就是避免数据库连接的频繁创建和销毁,节省系统开销,优化并发处理能力,是现代应用开发中不可或缺的基础组件。
    • 连接管理器负责管理和分配连接
    • 连接对象表示具体的数据库连接
    • 连接池则是存储多个连接对象的地方,确保高效的连接分配和复用

3.2 常见数据库连接池介绍

  • C3P0(被淘汰:历史悠久,过于复杂,性能差)
    • 特点:C3P0 是一个开源的 JDBC 连接池,支持 JDBC 3.0 和 2.0 的标准扩展。它能够通过 JNDI 进行数据源绑定,曾广泛应用于 Hibernate 和 Spring 等开源项目。
    • 优缺点:C3P0 的设计较为简单,但性能较差,尤其是在高并发场景下容易出现瓶颈。它的代码较为复杂且不易维护,官方也已停止更新,逐渐被淘汰。
  • DBCP (已淘汰:依赖 Commons-Pool,性能差)
    • 特点:由 Apache 开发的 JDBC 连接池,基于 Jakarta commons-pool 对象池机制。它通过将数据库连接预先加载到内存中,应用程序可以直接从连接池申请连接。
    • 优缺点:由于依赖 Commons-Pool,性能相对较差,尤其在高并发环境下表现不佳。没有自动回收空闲连接的功能,不适合要求较高的应用场景,逐步被淘汰。
  • Tomcat JDBC Pool(不推荐,性能没有Druid和HicariCP好)
    • 特点:Tomcat 从 7.0 版本开始引入的新连接池模块,兼容 DBCP,基于 Tomcat JULI 日志框架,支持异步连接获取,适用于高并发应用环境。
    • 优缺点:相较于 DBCP,性能更加优秀,支持更高并发,设计简单,易于集成到现有 Tomcat 环境中。适合需要高性能和稳定性的大型系统,尤其是基于 Tomcat 的 Web 应用。虽然性能较好,但相较于更现代的 HikariCP,仍然略逊一筹,不是性能最优的选择。
  • BoneCP(被淘汰:为解决C3P0/DBCP性能而生,后续出现了更高性能的hikariCP,BoneCP也不再更新)
    • 特点:尽管 BoneCP 在性能上表现出色,并且曾在一定时期内广泛使用,但随着 HikariCP 的出现,BoneCP 的优势逐渐被超越。更重要的是,BoneCP 项目已经停止维护,因此不再推荐使用。它不再适应现代应用程序的需求,缺乏对高并发、大规模数据处理的优化,也没有像 HikariCP 那样活跃的社区支持。
    • 优缺点:尽管 BoneCP 的性能非常好,但它的维护已经停止,并且现在被 HikariCP 所替代,因此不再推荐使用。
  • Druid (德鲁伊) - 推荐
    • 特点:Druid 是由阿里巴巴开源的高性能数据库连接池,支持包括 Oracle、MySQL、SQL Server 等常见数据库。Druid 提供了强大的监控功能,能够实时监控数据库连接的状态,支持 SQL 拦截、性能统计、连接泄漏检测以及长时间查询日志等功能。其设计理念注重大数据和高并发环境下的性能表现,尤其适合大规模的数据查询与分析。
    • 优缺点:Druid 是目前国内使用最广泛的数据库连接池,尤其适用于需要对数据库性能进行实时监控和优化的复杂应用场景。它具有丰富的管理监控功能,如 SQL 执行监控、连接泄漏检测、慢查询日志等,方便开发者调优性能并定位问题。不过,虽然 Druid 提供了极为丰富的功能,但在高并发情况下,它的性能表现略逊于 HikariCP。因此,如果项目对性能有极高的要求,Druid 可能不是最佳选择。Druid 更适用于需要复杂监控和调优的应用,而对于追求极致性能的场景,HikariCP 会是更好的选择。
  • HikariCP - 推荐
    • 特点:HikariCP 是目前公认的高性能 JDBC 连接池,专注于极致的性能优化。基于 BoneCP 进行了一系列的优化,注重快速响应和高吞吐量。Spring Boot 2.0 之后,HikariCP 被默认作为连接池。HikariCP 采用了高效的内存管理和高性能的线程池技术,能够在极短的时间内完成数据库连接的获取和释放。
    • 优缺点:HikariCP 在性能方面的表现无可挑剔,能够处理大量并发请求,吞吐量高,响应时间极短,特别适合高负载、高并发的生产环境。它的配置简单,易于与项目集成,并支持动态管理数据库连接。与 Druid 相比,HikariCP 更加专注于性能提升,虽然其功能相对较少,但对于大多数应用而言,简洁高效的设计是其最大的优势。HikariCP 不提供像 Druid 那样的 SQL 监控、日志统计等高级功能,因此如果项目需要这些功能,则需要额外考虑其他解决方案。对于绝大多数对性能要求较高的应用,HikariCP 是最佳选择。

3.3 常见数据库连接池对比

  • 上面六个数据库的对比分析:
功能C3P0DBCPTomcat JDBC PoolBoneCPDruidHikariCP
是否支持 PSCache
监控功能JMXJMXJMXJMX/log/httpJMX
扩展性较差较差较差
SQL 拦截及解析支持
代码复杂度复杂中等简单简单中等简单
更新时间2019.032019.027.0+ 引入-2019.052019.02
最新版本0.9.5.42.608.5.42-1.1.173.3.1
连接池管理LinkedBlockingDeque数组FairBlockingQueue-数组ThreadLocal + List
特点开源,适用于小型系统Apache开发,单线程高并发,Tomcat兼容高效但已淘汰高性能,监控强大性能极致,简单易用
  • 常见的数据库连接池的性能从高到低的排序为:HikariCP(BoneCP的进阶版) > Druid > Tomcat JDBC Pool > DBCP > C3P0,下图为HicariCP官网给出的性能对比矩形图
    img

3.4 总结

  • Tomcat JDBC Pool:适用于基于 Tomcat 的高并发环境,性能上优于 DBCP,但功能相对简单,缺少一些现代连接池的高级特性。
  • DBCP 和 C3P0:由于性能较差且维护较为困难,这两个连接池已经逐渐被 HikariCP 和 Druid 等新一代连接池所替代,因此不再推荐使用。
  • HikariCP:目前性能最优,特别适用于对性能要求极高的应用,如高并发和大规模系统。Spring Boot 2.0 默认使用 HikariCP,它已经成为行业标准。
  • Druid:功能丰富,适合需要复杂监控、SQL 拦截和数据分析的系统。尽管性能略逊于 HikariCP,但其在可扩展性和功能上的优势使其成为企业级应用的首选。
  • Spring Boot 集成:在后续的 Spring Boot 整合教程中,将只介绍 HikariCPDruid 这两种连接池。

4 数据源

4.1 数据源

  • 在介绍完数据库连接池后,我们来了解一下数据源(Data Source)。顾名思义,数据源指的是数据的来源,通常用于指定数据存储的位置。在应用程序中,数据源的主要作用是管理与数据存储系统(如数据库)的连接。
  • Java中,javax.sql.DataSource 接口提供了一种标准化的方式来获取数据库连接。该接口定义了 getConnection() 方法,允许应用程序以一致的方式获取数据库连接。通过这种方式,应用程序不需要直接管理数据库连接,而是通过数据源来进行集中管理和分配。
  • 不同类型的数据库(如 MySQL、PostgreSQL 等)会有不同的实现类来提供连接。为了提高性能,数据源通常与连接池结合使用,连接池管理多个数据库连接,避免每次请求时都需要重新建立连接,从而显著提升应用程序的效率。
  • 使用数据源的好处包括:
    • 简化连接管理:通过标准化接口,应用程序无需关心底层的数据库连接细节,降低了代码复杂度。
    • 提高资源利用率:连接池能够复用数据库连接,避免频繁地建立和关闭连接,提高系统资源的利用率。
    • 增强灵活性:通过数据源,应用程序可以更方便地切换不同的数据存储系统或数据库类型,而无需修改大量代码。

4.2 数据库连接池与数据源的关系

  • 很多人常常将数据源与连接池混淆,但实际上,它们在概念上是有区别的:
    • 数据源:数据源是指数据的来源,通常是数据库。它提供连接数据库所需的相关信息,如数据库地址、用户名、密码等。
    • 连接池:连接池是一种用于缓存和管理数据库连接的技术,它通过池化的方式复用连接,避免频繁创建和销毁连接带来的性能开销。
  • 为什么会出现这种混淆呢?这主要是因为在配置数据源时,通常会同时配置连接池的相关参数。因此,很多人误以为数据源就是连接池。实际上,数据源和连接池是紧密配合的,协同完成数据库连接的创建、管理和复用。
  • 在 Java 中,许多开源连接池(如 HikariCP 和 Druid)都基于标准的 javax.sql.DataSource 接口实现,这意味着它们既具备数据源的功能,也提供了连接池的管理能力。例如,Druid 提供了 com.alibaba.druid.pool.DruidDataSource 类,既是一个数据源实现,又包含了连接池的功能。通过配置 Druid 数据源,应用程序不仅能实现高效的数据库访问,还能利用 Druid 强大的监控和性能优化工具来管理数据库连接。
  • 总结:数据源是数据库连接的入口,应用程序通过数据源获取数据库连接,而无需手动配置驱动和连接细节。数据源通常与数据库连接池结合使用,以实现高效的数据库操作。在现代开发中,数据源和连接池密切配合,尤其是在 Spring Boot 项目中,选择合适的连接池实现(如 HikariCP 或 Druid)并与数据源结合,能显著提高数据库性能和系统稳定性。

5 承上启下

  • 在后端开发中,数据库作为核心数据存储介质,与其高效交互是每个后端工程师必须面对的重要任务。尤其是在基于 Spring Boot 的项目中,整合数据库更是项目初始化阶段的关键工作之一。
  • 在 Spring Boot 中,整合数据库通常包含两大部分:数据库驱动数据库连接池
    • 数据库驱动 是应用程序与数据库之间的桥梁,负责建立连接、执行 SQL 查询并返回结果。在 Spring Boot 中,为了与 MySQL 数据库进行交互,通常使用 MySQL 官方提供的 JDBC 驱动(com.mysql.cj.jdbc.Driver)。该驱动程序允许 Spring Boot 应用程序与 MySQL 数据库建立连接并执行数据操作。除此之外,Spring Boot 通过自动配置机制(Spring Boot Autoconfiguration),提供对 MySQL 数据源的默认支持。开发者只需在配置文件中提供必要的数据库连接信息(如数据库 URL、用户名和密码等),Spring Boot 即可自动创建和管理数据源实例,简化数据库访问的配置和使用。
    • 数据库连接池则是优化数据库连接管理的工具,通过复用和管理数据库连接,减少频繁建立和销毁连接的性能开销,从而显著提升应用的响应效率。在 Spring Boot 项目中,数据库连接池的选择直接影响到应用的性能和稳定性。Spring Boot 提供了多种数据库连接池的选项,其中最常用的是 HikariCP 和 Druid。这两种连接池各有优缺点,开发者可以根据项目需求选择最合适的连接池。
  • 下面是毛毛张关于SpringBoot配置两种常见的数据库连接池的教程:
    • 【SpringBoot教程】SpringBoot整合MySQL驱动和HicariCP连接池
    • 【SpringBoot教程】SpringBoot整合MySQL驱动和Druid连接池

都看到这了,不妨一键三连再走吧!

🌈欢迎和毛毛张一起探讨和交流!
联系方式点击下方个人名片

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

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

相关文章

深度学习 Pytorch 单层神经网络

神经网络是模仿人类大脑结构所构建的算法,在人脑里,我们有轴突连接神经元,在算法中,我们用圆表示神经元,用线表示神经元之间的连接,数据从神经网络的左侧输入,让神经元处理之后,从右…

GCC之编译(8)AR打包命令

GCC之(8)AR二进制打包命令 Author: Once Day Date: 2025年1月23日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章请查看专栏: Linux实践记录_Once-Day的博客-C…

SpringBoot统一功能处理

一.拦截器 1.拦截器的简单介绍 拦截器是Spring框架提供的核⼼功能之⼀,主要⽤来拦截⽤⼾的请求,在指定⽅法前后,根据业务需要执⾏预先设定的代码. 2.使用 (i).定义拦截器: (ii).注册拦截器 (iii).拦截路径 (iv).实行流程 3.登录校验 4.DispatcherServlet源码&…

31、Java集合概述

目录 一.Collection 二.Map 三.Collection和Map的区别 四.应用场景 集合是一组对象的集合,它封装了对象的存储和操作方式。集合框架提供了一组接口和类,用于存储、访问和操作这些对象集合。这些接口和类定义了不同的数据结构,如列表、集合…

Unity|小游戏复刻|见缝插针1(C#)

准备 创建Scenes场景,Scripts脚本,Prefabs预制体文件夹 修改背景颜色 选中Main Camera 找到背景 选择颜色,一种白中透黄的颜色 创建小球 将文件夹里的Circle拖入层级里 选中Circle,位置为左右居中,偏上&…

Word 中实现方框内点击自动打 √ ☑

注: 本文为 “Word 中方框内点击打 √ ☑ / 打 ☒” 相关文章合辑。 对第一篇增加了打叉部分,第二篇为第一篇中方法 5 “控件” 实现的详解。 在 Word 方框内打 √ 的 6 种技巧 2020-03-09 12:38 使用 Word 制作一些调查表、检查表等,通常…

Android Studio:视图绑定的岁月变迁(2/100)

一、博文导读 本文是基于Android Studio真实项目,通过解析源码了解真实应用场景,写文的视角和读者是同步的,想到看到写到,没有上帝视角。 前期回顾,本文是第二期。 private Unbinder mUnbinder; 只是声明了一个 接口…

第13章 深入volatile关键字(Java高并发编程详解:多线程与系统设计)

1.并发编程的三个重要特性 并发编程有三个至关重要的特性,分别是原子性、有序性和可见性 1.1 原子性 所谓原子性是指在一次的操作或者多次操作中,要么所有的操作全部都得到了执行并 且不会受到任何因素的干扰而中断,要么所有的操作都不执行…

算法中的移动窗帘——C++滑动窗口算法详解

1. 滑动窗口简介 滑动窗口是一种在算法中常用的技巧,主要用来处理具有连续性的子数组或子序列问题。通过滑动窗口,可以在一维数组或字符串上维护一个固定或可变长度的窗口,逐步移动窗口,避免重复计算,从而提升效率。常…

基于SpringBoot的网上考试系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

【java数据结构】map和set

【java数据结构】map和set 一、Map和Set的概念以及背景1.1 概念1.2 背景1.3 模型 二、Map2.1 Map说明2.2 Map的常用方法 三、Set3.1 Set说明3.2 Set的常用方法 四、Set和Map的关系 博客最后附有整篇博客的全部代码!!! 一、Map和Set的概念以及…

基于迁移学习的ResNet50模型实现石榴病害数据集多分类图片预测

完整源码项目包获取→点击文章末尾名片! 番石榴病害数据集 背景描述 番石榴 (Psidium guajava) 是南亚的主要作物,尤其是在孟加拉国。它富含维生素 C 和纤维,支持区域经济和营养。不幸的是,番石榴生产受到降…

企业信息化2:行政办公管理系统

总裁办公室作为综合行政管理部门服务于整个公司,工作职责包含从最基础的行政综合到协调督办、对外政务、品牌建设等等,工作量繁多而且琐碎。如何通过信息化来实现标准化和常态化的管理手段,确保总裁办的各项工作有章可循,提高工作…

基于springboot+vue的古城景区管理系统的设计与实现

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

使用 Elasticsearch 导航检索增强生成图表

作者:来自 Elastic Louis Jourdain 及 Ivan Monnier 了解如何使用知识图谱来增强 RAG 结果,同时在 Elasticsearch 中高效存储图谱。本指南探讨了根据用户查询动态生成知识子图的详细策略。 检索增强生成 (RAG) 通过将大型语言模型 (LLM) 的输出基于事实数…

【数据结构】_以SLTPushBack(尾插)为例理解单链表的二级指针传参

目录 1. 第一版代码 2. 第二版代码 3. 第三版代码 前文已介绍无头单向不循环链表的实现,详见下文: 【数据结构】_不带头非循环单向链表-CSDN博客 但对于部分方法如尾插、头插、任意位置前插入、任意位置前删除的相关实现,其形参均采用了…

ceph新增节点,OSD设备,标签管理(二)

一、访问客户端集群方式 方式一: 使用cephadm shell交互式配置 [rootceph141 ~]# cephadm shell # 注意,此命令会启动一个新的容器,运行玩后会退出! Inferring fsid c153209c-d8a0-11ef-a0ed-bdb84668ed01 Inferring config /var/lib/ce…

Spring Data JPA 实战:构建高性能数据访问层

1 简介 1.1 Spring Data JPA 概述 1.1.1 什么是 Spring Data JPA? Spring Data JPA 是 Spring Data 项目的一部分,旨在简化对基于 JPA 的数据库访问操作。它通过提供一致的编程模型和接口,使得开发者可以更轻松地与关系型数据库进行交互,同时减少了样板代码的编写。Spri…

Git进阶笔记系列(01)Git核心架构原理 | 常用命令实战集合

读书笔记:卓越强迫症强大恐惧症,在亲子家庭、职场关系里尤其是纵向关系模型里,这两种状态很容易无缝衔接。尤其父母对子女、领导对下属,都有望子成龙、强将无弱兵的期望,然而在你的面前,他们才是永远强大的…

基于模糊PID的孵化箱温度控制系统(论文+源码)

1系统方案设计 本课题为基于模糊PID的孵化箱温度控制系统,其以STM32最小系统与模糊PID控制器为控制核心。系统主要包括数据采集模块、处理器模块、电机控制模块。 数据采集模块由温度传感器构成,通过温度传感器感应温度变化,获得待处理的数据…