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.mzph.cn/news/893795.shtml

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

相关文章

MyBatis框架基础学习及入门案例(2)

目录 一、数据库建表(tb_user)以及添加数据。 (1)数据库与数据表说明。 (2)字段与数据说明。 二、创建模块(或工程)、导入对应所需依赖坐标。 三、编写MyBatis核心主配置文件。(解决JDBC中"硬编码"问题) (1&…

js小游戏---2048(附源代码)

一、游戏页面展示 开始游戏: 游戏结束: 二、游戏如何操作 通过监听键盘的操作,进行移动变化 键盘上下左右键控制页面中所有模块同时向键入的方向移动,如果有两块一样的方块,就进行合并,并且在键盘每操作…

美格智能AIMO智能体+DeepSeek-R1模型,AI应用的iPhone时刻来了

导语: 当AI大模型从云端下沉至终端设备,一场关于效率、隐私与智能化的革命悄然展开。作为全球领先的无线通信模组及解决方案提供商,美格智能凭借其高算力AI模组矩阵与端侧大模型部署经验,结合最新发布的AIMO智能体产品&#xff0…

C语言的灵魂——指针(1)

指针是C语言的灵魂,有了指针C语言才能完成一些复杂的程序;没了指针就相当于C语言最精髓的部分被去掉了,可见指针是多么重要。废话不多讲我们直接开始。 指针 一,内存和地址二,编址三,指针变量和地址1&#…

物业巡更系统助推社区管理智能化与服务模式创新的研究与应用

内容概要 在现代社区管理中,物业巡更系统扮演着至关重要的角色。首先,我们先来了解一下这个系统的概念与发展背景。物业巡更系统,顾名思义,是一个用来提升物业管理效率与服务质量的智能化工具。随着科技的发展,传统的…

每日一题 427. 建立四叉树

427. 建立四叉树 class Solution { public:Node* construct(vector<vector<int>>& grid) {int n grid.size();return dfs(grid,0,0,n);}bool allSame(vector<vector<int>>& grid, int x,int y,int len){int val grid[x][y];for(int i0;i<…

关于CAN(FD)转以太网详细介绍

一、功能描述 CANFD 完全向下兼容 CAN &#xff0c;以下统称 CAN(FD) 。 SG-CAN(FD)NET-210 是一款用来把 CANFD 总线数据转为网口数据的设备。 网口支持 TCP Sever 、 TCP Client 、 UDP Sever 、 UDP Client 四种模式。 可以通过软件配置和 Web 网页配置。 两路…

用Python和PyQt5打造一个股票涨幅统计工具

在当今的金融市场中&#xff0c;股票数据的实时获取和分析是投资者和金融从业者的核心需求之一。无论是个人投资者还是专业机构&#xff0c;都需要一个高效的工具来帮助他们快速获取股票数据并进行分析。本文将带你一步步用Python和PyQt5打造一个股票涨幅统计工具&#xff0c;不…

Centos类型服务器等保测评整/etc/pam.d/system-auth

修改服务器配置文件/etc/pam.d/system-auth&#xff0c;但是&#xff0c;把一下配置放在password的配置第一行才会生效 执行命令&#xff1a;配置口令要求&#xff1a;大小写字母、数字、特殊字符组合、至少8位&#xff0c;包括强制设置root口令&#xff01; sed -i 14a pas…

At coder beginner contest 290AB

A12435 思路&#xff1a;只有4中情况:A1,A2翻转&#xff0c;其他正常&#xff0c;A2A3翻转其他正常.....为了下标与数字对应我开了6个空间&#xff0c;然后从1开始循环&#xff0c;到4截止&#xff0c;因为循环中有i1害怕数组越界&#xff0c;如果索引出的数与下标不相等了&…

【ElasticSearch】 Java API Client 7.17文档

​ 本文章内容根据 Elastic Search Java API Client 7.17 版本官方文档 内容翻译而来&#xff0c;用于方便后续学习翻阅 序言 这是适用于 Elasticsearch 的官方 Java API Client 文档。该客户端针对所有 Elasticsearch API 提供强类型的请求和响应。 功能 所有 Elasticsearc…

Vue3 + TS 实现批量拖拽 文件夹和文件 组件封装

一、html 代码&#xff1a; 代码中的表格引入了 vxe-table 插件 <Tag /> 是自己封装的说明组件 表格列表这块我使用了插槽来增加扩展性&#xff0c;可根据自己需求&#xff0c;在组件外部做调整 <template><div class"dragUpload"><el-dial…

STM32完全学习——RT-thread在STM32F407上移植

一、写在前面 关于源码的下载&#xff0c;以及在KEIL工程里面添加操作系统的源代码&#xff0c;这里就不再赘述了。需要注意的是RT-thread默认里面是会使用串口的&#xff0c;因此需要额外的进行串口的初始化&#xff0c;有些人可能会问&#xff0c;为什么不直接使用CubMAX直接…

JVM深入学习(一)

目录 一.JVM概述 1.1 为什么要学jvm&#xff1f; 1.2 jvm的作用 1.3 jvm内部构造 二.JVM类加载 2.1类加载过程 2.2类加载器 2.3类加载器的分类 2.4双亲委派机制 三.运行时数据区 堆空间区域划分&#xff08;堆&#xff09; 为什么分区(代)&#xff1f;&#xff08…

Spring Boot(6)解决ruoyi框架连续快速发送post请求时,弹出“数据正在处理,请勿重复提交”提醒的问题

一、整个前言 在基于 Ruoyi 框架进行系统开发的过程中&#xff0c;我们常常会遇到各种有趣且具有挑战性的问题。今天&#xff0c;我们就来深入探讨一个在实际开发中较为常见的问题&#xff1a;当连续快速发送 Post 请求时&#xff0c;前端会弹出 “数据正在处理&#xff0c;请…

002-SpringBoot整合AI(Alibaba)

SpringBoot整合AI 一、引入依赖二、配置application.yml三、获取 api-key四、编写 controller五、起服务调用 一、引入依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><vers…

安宝特方案 | 智能培训:安宝特AR如何提升企业技能培训的效率与互动性

随着企业不断推进数字化转型&#xff0c;传统培训方式已无法满足现代企业对高效、灵活培训的需求。尤其在技术更新频繁、工艺流程复杂、员工流动性大的环境中&#xff0c;传统培训模式的局限性愈加明显。为了提升培训质量、降低培训成本&#xff0c;并帮助员工迅速掌握新技能&a…

【阅读笔记】基于整数+分数微分的清晰度评价算子

本文介绍的是一种新的清晰度评价算子&#xff0c;整数微分算子分数微分算子 一、概述 目前在数字图像清晰度评价函数中常用的评价函数包括三类&#xff1a;灰度梯度评价函数、频域函数和统计学函数&#xff0c;其中灰度梯度评价函数具有计算简单&#xff0c;评价效果好等优点…

Windows 下本地 Docker RAGFlow 部署指南

Windows 下本地 Docker RAGFlow 部署指南 环境要求部署步骤1. 克隆代码仓库2. 配置 Docker 镜像加速(可选)3. 修改端口配置(可选)4. 启动服务5. 验证服务状态6. 访问服务7. 登录系统8. 配置模型8.1 使用 Ollama 本地模型8.2 使用在线 API 服务9. 开始使用10. 常见问题处理端…

【学习笔记】计算机网络(二)

第2章 物理层 文章目录 第2章 物理层2.1物理层的基本概念2.2 数据通信的基础知识2.2.1 数据通信系统的模型2.2.2 有关信道的几个基本概念2.2.3 信道的极限容量 2.3物理层下面的传输媒体2.3.1 导引型传输媒体2.3.2 非导引型传输媒体 2.4 信道复用技术2.4.1 频分复用、时分复用和…