Spring数据源

news2024/12/28 18:45:05

⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章
⭐作者主页:@逐梦苍穹
⭐所属专栏:JavaEE、Spring

目录

  • 1、简介
  • 2、作用
  • 3、开发步骤
    • 3.1、导入坐标
    • 3.2、创建对象
      • c3p0
      • druid
      • 提取jdbc.properties
      • 读取配置文件
    • 3.3、Spring设置数据源
      • 注意
      • 再解耦
    • 3.4、使用数据源
      • 手动
      • 使用jdbc.properties
      • Spring容器创建

1、简介

在这里插入图片描述

Spring框架提供了多种数据源选项,常见的有以下几种:

  1. JDBC数据源:Spring提供了对JDBC数据源的支持,可以通过配置数据源参数来连接各种关系型数据库,如MySQL、Oracle、PostgreSQL等。你可以使用Spring的JdbcTemplate或者ORM框架(如Hibernate)来执行SQL操作。
  2. Apache Tomcat数据源:Spring支持使用Apache Tomcat提供的连接池作为数据源。Tomcat数据源是一个成熟的连接池实现,可以高效地管理数据库连接。
  3. HikariCP数据源:HikariCP是一个快速高效的连接池,被广泛用于Java应用程序中。Spring可以集成HikariCP作为数据源,通过配置参数来管理连接池。
  4. C3P0数据源:C3P0是一个受欢迎的连接池库,也可以作为Spring的数据源。你可以配置C3P0连接池的参数,以满足应用程序对数据库连接的需求。
  5. 还有其他第三方连接池库,如DBCP、BoneCP等,也可以与Spring集成作为数据源。

使用Spring数据源,你可以在Spring的配置文件中定义数据源,并通过注入的方式在应用程序中使用它。这样,你就可以方便地访问数据库,并执行相应的数据库操作。

2、作用

Spring数据源的主要作用是提供数据库连接池,以管理和分配数据库连接。数据库连接是与数据库交互的关键资源之一,每次与数据库建立连接的过程都需要进行网络通信和身份验证,这是一个开销较大的操作。通过使用数据源,可以避免频繁地创建和销毁数据库连接,提高应用程序的性能和响应速度。
以下是Spring数据源的一些主要作用:

  1. 连接管理:数据源负责创建、管理和维护数据库连接。它可以在应用程序启动时初始化一定数量的连接,并在需要时分配连接给应用程序。连接使用完毕后,数据源可以将连接归还到连接池中,以便其他请求可以继续复用该连接,减少连接创建和销毁的开销。
  2. 连接池管理:数据源通过连接池来管理数据库连接。连接池维护一定数量的可用连接,当应用程序请求连接时,从连接池中获取一个可用连接分配给应用程序。如果连接池中没有可用连接,数据源可以根据配置的策略来创建新的连接或等待可用连接释放。
  3. 连接配置:数据源允许你配置数据库连接的参数,如数据库驱动、URL、用户名、密码等。这些配置可以集中管理,便于维护和修改,而不需要在应用程序的多个地方进行重复配置。
  4. 事务管理:Spring数据源与Spring的事务管理框架紧密集成,可以为应用程序提供事务管理的功能。它可以与Spring的声明式事务管理一起使用,自动管理事务的起始、提交和回滚,并确保在事务范围内的数据库操作的一致性和隔离性。
  5. 故障恢复:数据源可以处理数据库连接的异常情况,如连接超时、连接断开等。它可以检测到连接的异常状态,并尝试重新建立连接,从而提高应用程序的可靠性和容错性。

通过使用Spring数据源,应用程序可以更高效地管理数据库连接,提升应用性能和扩展性。同时,数据源还提供了一些额外的功能,如连接池配置、事务管理等,使开发人员能够更轻松地进行数据库操作和事务管理。

3、开发步骤

① 导入数据源的坐标和数据库驱动坐标
② 创建数据源对象
③ 设置数据源的基本连接数据
④ 使用数据源获取连接资源和归还连接资源

3.1、导入坐标

在这里插入图片描述

3.2、创建对象

c3p0

ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
dataSource.setUser("root");
dataSource.setPassword("root");
Connection connection = dataSource.getConnection();
System.out.println(connection);
connection.close();

druid

DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/test");
dataSource.setUsername("root");
dataSource.setPassword("root");
DruidPooledConnection connection = dataSource.getConnection();
System.out.println(connection);
connection.close();

提取jdbc.properties

前面两种创建方式耦合度太高,下面进行解耦合:提取jdbc.properties配置文件:
在这里插入图片描述
在这里插入图片描述

读取配置文件

配置文件里面的内容,实际上就是键值对,类如jdbc.url是一种约定俗成的写法,但是实际上如果写成username=root也无可厚非,不会报错,但是不建议这样做
在这里插入图片描述

ResourceBundle.getBundle方法是Java提供的用于加载资源束(Resource Bundle)的静态方法。它的使用方式如下:
通过基名加载默认的资源束:ResourceBundle rb = ResourceBundle.getBundle(“bundleName”);
这种用法会根据指定的bundleName加载默认的资源束。
默认的资源束文件的命名约定是bundleName.properties,其中bundleName是资源束的基名。

3.3、Spring设置数据源

可以将DataSource的创建权交由Spring容器去完成

  1. DataSource有无参构造方法,而Spring默认就是通过无参构造方法实例化对象的
  2. DataSource要想使用需要通过set方法设置数据库连接信息,而Spring可以通过set方法进行字符串注入

Druid数据源:
在这里插入图片描述

C3p0数据源:
在这里插入图片描述

注意

xml配置数据源只能有一个!
在这里插入图片描述

再解耦

上面配置的时候,也是把配置信息写在applicationContext.xml里面,这样依旧耦合。
下面结合jdbc.properties和applicationContext.xml,使用spring提供的命名空间引入配置文件,从而实现对配置信息进行抽取:
在这里插入图片描述
在这里插入图片描述

3.4、使用数据源

手动

在这里插入图片描述
在这里插入图片描述

使用jdbc.properties

在这里插入图片描述

Spring容器创建

在这里插入图片描述

DataSource是一个数据源对象:
在这里插入图片描述

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

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

相关文章

【iOS】App仿写--3GShare

文章目录 前言一、账号界面二、主页界面二、搜索界面三、文章界面四、活动界面五、我的界面总结 前言 这周写了3GShare的demo,这是一个十分麻烦的demo,比网易云需要设计的知识更多,特此撰写一下博客记录总结 一、账号界面 这里账号界面主要…

SourceTree使用ssh密钥

设置Git的user name和email: $ git config --global user.name "xxx" $ git config --global user.email "xxx.mailxxx.com".检查是不是已经存在密钥(能进去说明已经存在,就删掉文件夹,重新创建)…

SPSS数据文件的结构重组

前言: 本专栏参考教材为《SPSS22.0从入门到精通》,由于软件版本原因,部分内容有所改变,为适应软件版本的变化,特此创作此专栏便于大家学习。本专栏使用软件为:SPSS25.0 本专栏所有的数据文件可在个人主页—…

python:GEDI 波形数据提取

作者:CSDN @ _养乐多_ 在这篇博客中,我们将介绍如何使用 Python 处理和可视化 GEDI(Global Ecosystem Dynamics Investigation)激光雷达数据。GEDI 是 NASA(美国国家航空航天局)推出的激光雷达地球观测任务,用于获取全球各地生态系统的三维结构信息。本文将以提取研究区…

VSCode同时编译多个C文件

一.环境说明 1.系统:Ubuntu 22.04.2 LTS 2.Visual Studio Code: 1.80.1 二.问题描述 今天使用VSCode编译《Programming Abstractions In C》书中的gymjudge.c代码时遇到错误,错误提示为: (base) codistspc:~/projects/Programming-Abstracti…

Ubuntu下打开QtCreator环境变量LD_LIBRARY_PATH与终端不一致

问题描述: 在unbuntu下使用QtCreator编译、运行程序时,总是出现XXX.so: cannot open shared object file: No such file or directory这类问题,但是在终端中编译或者运行程序则不会出现这些问题。在网上查了好久才明白QtCreator在打开时&…

【Visual Studio】Qt 在其他 cpp 文件中调用主工程下文件中的函数

知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 还整了一个如何在其他文件中调用 ui 控件的文章,感兴趣可以看:【Visual Studio】Qt 在其他 cpp 文件中调用操作 ui 界面控件。 文章目…

机器学习实战10-基于spark大数据技术与机器学习的结合应用实战

大家好,我是微学AI,今天给大家介绍一下机器学习实战10-基于spark大数据技术与机器学习的结合应用实战,Spark是一种快速、通用的大数据处理框架。它是由加州大学伯克利分校AMPLab开发。Spark提供了一个分布式计算的平台,可以在集群…

计算机组成与体系结构 概述

文章目录 计算机组成与体系结构 概述计算机系统概述计算机系统的组成计算机层次结构 计算机性能评价 计算机组成与体系结构 概述 计算机系统概述 计算机系统的组成 计算机的基本部件: 运算器:ALU、GPRs(通用寄存器组)、标志寄…

Java编程教程-Java ObjectStreamClass

ObjectStreamClass作为类的序列化描述符。该类包含类的名称和serialVersionUID。 # 方法 # 示例 toString() It returns a string describing this ObjectStreamClass.Exampleimport java.io.ObjectStreamClass; import java.util.Calendar; public class ObjectStreamCl…

谷歌插件(Chrome扩展) “Service Worker (无效)” 解决方法

问题描述: 写 background 文件的时候报错了,说 Service Worker 设置的 background 无效。 解决(检查)方法: 检查配置文件(manifest.json) 中的 manifest_version 是否为 3。 background 中的…

深入探索Spring的Bean注入:四种方式解析与循环依赖探讨

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

Docker-Compose 轻松搭建 Grafana+InfluxDb 实用 Jmeter 监控面板

目录 前言: 1、背景 2、GranfanaInfluxDB 配置 2.1 服务搭建 2.2 配置 Grafana 数据源 2.3 配置 Grafana 面板 3、Jmeter 配置 3.1 配置 InfluxDB 监听器 3.2 实际效果 前言: Grafana 和 InfluxDB 是两个非常流行的监控工具,它们可…

【力扣每日一题】2023.7.20 环形子数组的最大和

题目: 示例: 分析: 题目描述的有点复杂,特别是那个公式,一看到我就烦. 其实意思就是找出一个子数组(连续),要求这个子数组的和是所有子数组中最大的,并且这个数组是环形的,意思就是我这个子数组可以从原数组的尾部开始,到原数组的头部结束,…

Nginx文件下载预览加权限验证的思考和实现

做的项目中多个模块涉及到附件、图片、PDF/Excel等文件的处理,包括预览、导出和下载等功能。对于体积较小的文件,可以直接由后端以流形式传输给前端处理;而较大的文件则需要通过nginx进行转发。但是如果nginx中不设置鉴权服务,可能…

帖子列表和SerializerMixin注意事项

帖子序列化 继承SerializerMixin 即可调用to_dict()序列化 后端 class PostModel(db.Model, SerializerMixin):serialize_only ("id", "title", "content", "create_time", "board", "author")__tablename__ …

Ubuntu22.04上部署Lua开发环境

需求背景 想在Ubuntu22.04上搭建一下Lua的开发环境,其实步骤比较简单的,此文章也适用于Ubuntu主机环境搭建Lua,如果想在在Ubuntu内部署一个容器,然后在容器内搭建Lua的环境,可以先参考容器的创建过程 ubuntu22.04上如何创建有pri…

android adb命令获取处于当前屏幕的Activity

android adb命令获取处于当前屏幕的Activity 使用adb命令: adb shell dumpsys activity activities 输出,例如: ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities) Display #0 (activities from top to bottom): * Task{38ef601 #5281 typ…

C++-----list

本期我们来讲解list,有了string和vector的基础,我们学习起来会快很多 目录 list介绍 ​编辑 list常用接口 insert erase reverse sort merge unique remove splice 模拟实现 基础框架 构造函数 push_back 迭代器 常见问题 const迭代器 …

BEVPoolv2 A Cutting-edge Implementation of BEVDet Toward Deployment 论文学习

Github Repo: https://github.com/HuangJunJie2017/BEVDet/tree/dev2.0 Arxiv Paper: https://arxiv.org/abs/2211.17111 1. 解决了什么问题? 多相机 3D 目标检测是自动驾驶领域的基本任务,受到学术界和工业界的大量关注。Lift-Splat-Shoot view trans…