一文搞懂 springboot 如何融合数据源

 1、简介

        springboot 支持关系型数据库的相关组件进行配置,包括数据源、连接池、事务管理器等的自动配置。降低了数据库使用的难度,除了 mysql 还支持 Derby、H2等嵌入式数据库的自动配置,MongoDB、Redis、elasticsearch等常用的 NoSQL 的数据库自动配置。

        本文以 mysql 数据库为例。

2、数据源

引入以下依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>

        spring-boot-starter-data-jdbc 依赖中包含一个默认的 HikariCP 连接池,以及连接 JDBC 需要的相关依赖,但是具体的数据库驱动是需要额外导入的,上述导入的是 mysql 驱动。

        数据源的自动配置类是 DataSourceAutoConfiguration 类,配置类是 DataSourceProperties 。

// 配置采用的前缀是:spring.datasource.*
@ConfigurationProperties(prefix = "spring.datasource")
// 配置数据库连接池参数 spring.datasource.hikari.*
2.1、自定义数据源

        如果自定义数据源,直接注册一个 DataSorce 数据源实现类即可,根据 springboot 自动配置类使用的条件注解配置规则,如果应用已经注册相关的数据源实例,自动配置类中相关数据库连接池中的数据源就不会自动配置了。示例如下:

@SpringBootConfiguration(proxyBeanMethods = false)
public class DSource {   @Bean@ConfigurationProperties(prefix = "spring.datasource")public DataSource dataSource(){return new XxxDataSource();}
}

还可以进行多数据源配置:

@SpringBootConfiguration(proxyBeanMethods = false)
public class DSource {@Primary@Bean@ConfigurationProperties(prefix = "spring.datasource.one")public DataSource dataSource1(){return new XxxDataSource();}@Bean@ConfigurationProperties(prefix = "spring.datasource.two")public DataSource dataSource2(){return new XxxDataSource();}
}
2.2、连接池
2.2.1、HikariCP 连接池

        spring-boot-starter-data-jdbc(包含 spring-boot-starter-jdbc)、spring-boot-starter-data-jpa 都默认使用 HikariCP 连接池,可以通过 spring.datasource.type 指定使用的是哪个连接池。

2.2.2、druid 连接池

        国内推荐使用 Druid 连接池,这是一个为监控而生的连接池,具有强大的扩展和监控功能,使用 Druid 配置数据源参数:spring.datasource.druid.*。 

<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.5</version>
</dependency>

如果 Druid 数据源没有配置相关参数(usename、password等参数),则取 springboot 通用的数据源配置参数。

3、事务管理器

         springboot 提供事务和事务管理器的自动配置(spring-boot-starter-data-jdbc 中会包含事务相关的包),绑定 TransactionProperties 类,通过 spring.transaction.* 进行参数配置。在需要使用事务的方法上添加 @Transactional 注解即可。

3.1、事务失效场景

1、数据库引擎不支持事务,例如:mysql 的 MyISAM,只有 InnoDB 支持事务。

2、使用的方法不是在 spring 容器中的对象(未被 spring 容器管理)。

3、使用的方法不是 public 的。

4、发生本类中的自身方法相互调用,这种情况没有经过 spring 的代理类,默认只有调用外部代理类的方法,事务才生效。(解决方案:1)、在事务所在的类中注入自己,使用注入的对象调用;2)、可以在当前线程中获取代理类,可以通过以下方式)。

// 在类上添加以下注解
@EnableAspectJAutoProxy(exposeProxy=true)
// 然后在调用方法的时候使用
((当前类实现的接口)AopContext.currentProxy()).**()

5、设置不支持事务,事务的传播行为被设置为 NOT_SUPPORT。

6、异常捕获没有被抛出。

7、抛出的异常类型不匹配,spring 默认回滚的是 RuntimeException 异常,如果要指定发生什么异常回滚事务,则在 @Transactional(rollbackFor=Exception.class) 注解中指定。

4、总结

        本文介绍 springboot 数据访问的方式,从数据源到数据库连接池,再到事务管理,更进一步加强对 springboot 使用数据源的理解。有关如何自定义事务管理器,进一步理解数据库连接池等内容在后文详解。

        本人是一个从小白自学计算机技术,对运维、后端、各种中间件技术、大数据等有一定的学习心得,想获取自学总结资料(pdf版本)或者希望共同学习,关注微信公众号:it自学社团。后台回复相应技术名称/技术点即可获得。(本人学习宗旨:学会了就要免费分享)

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

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

相关文章

BGP邻居故障检测

第一种情况:如果AR2和AR4采用直连建立邻居,则排查步骤如下: 1)在AR2和AR4上使用ping x.x.x.x命令检查AR2和AR4用于建立EBGP邻居关系的直连地址连通性是否正常。如果不能ping通。则需要使用二分法从网络层向下层逐层进行排查,首先检查接口地址及路由的可达性,修改完成后,如…

Codeforces Round 914 (Div. 2)(D1/D2)--ST表

Codeforces Round 914 (Div. 2)(D1/D2)–ST表 D1. Set To Max (Easy Version) 题意&#xff1a; 给出长度为n的数组a和b&#xff0c;可以对a进行任意次数操作&#xff0c;操作方式为选择任意区间将区间内值全部变成该区间的最大值&#xff0c; 是否有可能使得数组a等于数组b…

WEB3:互联网发展的新时代

随着科技的飞速发展&#xff0c;互联网已从最初的信息交流平台发展为涵盖了工作、生活、娱乐、教育等众多领域的复杂系统。我们将其称之为“WEB3”&#xff0c;这个名称是对互联网新时代的高度概括&#xff0c;标志着我们已经迈入了WEB3时代。 在WEB3时代&#xff0c;互联网将…

MySQL 函数触发隐式转换应对策略

文章目录 前言1. 环境介绍2. MySQL 5.72.1 执行计划2.2 虚拟列优化2.3 原理解析 3. MySQL 8.03.1 执行计划3.2 函数索引优化3.3 原理解析 前言 MySQL 中&#xff0c;当 SQL 索引字段使用了函数的话&#xff0c;会出现隐式转换的问题&#xff0c;导致索引失效&#xff0c;从而导…

C# CAD界面-自定义窗体(三)

运行环境 vs2022 c# cad2016 调试成功 一、引用 二、开发代码进行详细的说明 初始化与获取AutoCAD核心对象&#xff1a; Database db HostApplicationServices.WorkingDatabase;&#xff1a;这行代码获取当前工作中的AutoCAD数据库对象。在AutoCAD中&#xff0c;所有图形数…

《短链接--阿丹》--技术选型与架构分析

整个短链接专栏会持续更新。有兴趣的可以关注一下我的这个专栏。 《短链接--搭建解析》--立项+需求分析文档-CSDN博客 阿丹: 其实整套项目中的重点,根据上面的简单需求分析来看,整体的项目难题有两点。 1、快速的批量生成短链,并找到对应的存储。 并且要保持唯一性质。…

深入探索MySQL的虚拟列:发展、原理与应用

当我们谈论数据库优化时&#xff0c;经常会遇到各种技术和策略。其中&#xff0c;MySQL的虚拟列&#xff08;也被称为生成列或存储列&#xff09;是一个引人注目的特性。它不仅可以帮助开发者提高查询效率&#xff0c;还能为数据表提供额外的计算功能&#xff0c;而无需真正改变…

【Linux驱动】块设备驱动(二)—— 块设备读写(使用请求队列)

块设备的操作函数并没有类似于字符驱动中的read 和write函数&#xff0c;要实现读写操作&#xff0c;只能在请求处理函数中实现。这就分为两种&#xff0c;是否要使用请求队列&#xff0c;请求队列的主要作用是管理和调度IO请求。在以下情况中&#xff0c;一般需要用到请求队队…

跑路页面HTML源码

简单的HTMLJSCSS&#xff0c;记事本修改内容&#xff0c;喜欢的朋友可以下载 https://download.csdn.net/download/huayula/88811984

vivado RTL综合中的多线程

RTL综合中的多线程 在多处理器系统上&#xff0c;RTL合成默认情况下利用多个CPU核心&#xff08;最多四个&#xff09;来加快编译时间。同时运行的线程的最大数量会有所不同&#xff0c;具体取决于处理器的数量可在系统、操作系统和流程阶段使用&#xff08;请参阅Vivado Desi…

Thinkpad E550 安装 Ubuntu

参考&#xff1a;使用U盘安装Ubuntu20.04 Thinkpad E550 使用 enterf1进入 bios&#xff0c; 使用 f12 进入 boot 选项。不知道这个和系统有啥关系&#xff0c;感觉之前不是这样。。。 下载镜像 下载镜像 22.04 可以下载相应的 torrent 文件&#xff0c;然后用 百度网盘或者…

HTTP1.1、HTTP2、HTTP3

HTTP1.1 HTTP/1.1 相比 HTTP/1.0 性能上的改进&#xff1a; 使用长连接的方式改善了 HTTP/1.0 短连接造成的性能开销。支持管道&#xff08;pipeline&#xff09;网络传输&#xff0c;只要第一个请求发出去了&#xff0c;不必等其回来&#xff0c;就可以发第二个请求出去&…

Linux基础-磁盘分区

1.Linux磁盘分区方案 1.根分区/ 2./boot 3./var/log 4.swap虚拟交换分区&#xff0c;当物理内存不够用&#xff0c;需要用swap 5.自定义分区&#xff1a; ①创建一个目录/etc/mysql装mysql数据库软件 ②再创建一个目录/backup存放mysql数据库备份文件 2.磁盘分区划分 第一个…

(22)删除指定的数

文章目录 每日一言题目解题思路代码结语 每日一言 你热爱生命吗&#xff1f;那就别浪费时间&#xff0c;因为时间是组成生命的材料。——富兰克林 题目 先输入10个整数存放在数组中&#xff0c;再输入一个整数n&#xff0c;删除数组中所有等于n的数字&#xff0c;打印数组中剩…

在VM虚拟机上搭建MariaDB数据库服务器

例题&#xff1a;搭建MariaDB数据库服务器&#xff0c;并实现主主复制。 1.在二台服务器中分别MariaDB安装。 2.在二台服务器中分别配置my.cnf文件&#xff0c;开启log_bin。 3.在二台服务器中分别创建专用于数据库同步的用户replication_user&#xff0c;并授权SLAVE。&#x…

Matplotlib绘制炫酷柱状图的艺术与技巧【第60篇—python:Matplotlib绘制柱状图】

文章目录 Matplotlib绘制炫酷柱状图的艺术与技巧1. 簇状柱状图2. 堆积柱状图3. 横向柱状图4. 百分比柱状图5. 3D柱状图6. 堆积横向柱状图7. 多系列百分比柱状图8. 3D堆积柱状图9. 带有误差线的柱状图10. 分组百分比柱状图11. 水平堆积柱状图12. 多面板柱状图13. 自定义颜色和样…

c#string方法对比

字符串的截取匹配操作在开发中非常常见&#xff0c;比如下面这个示例&#xff1a;我要匹配查找出来字符串数组中以“abc”开头的字符串并打印&#xff0c;我下面分别用了两种方式实现&#xff0c;代码如下&#xff1a; using System; namespace ConsoleApp23{ class Progra…

aidl复杂流程封装

1 aidl相关困扰点 1 制作步骤复杂&#xff0c;先定义然后编译&#xff0c;然后复制&#xff0c;两边都要一一对应 2 增加回调&#xff0c;自定义对象流程更加麻烦&#xff0c;还要处理对象数据流是 in 还是out。 3 一方异常怎么办&#xff0c;虽然服务端可以用 RemoteCallbackL…

UI自动化中元素无法定位问题解决方法

元素无法定位问题解决方法 1、display屏蔽元素2、iframe内元素无法定位3、 根据部分元素属性定位4、页面跳转到新的标签页&#xff0c;或者弹出的警告框等6、使用WebDriver调用JavaScript代码代替无法实现的功能 1、display屏蔽元素 分析一下html的display属性&#xff0c;可以…

计算机网络(复习资料)

1.互联网的两个重要基本特点 连通性和共享性 2.计算机网络由若干节点和连接这些节点的链路组成 3.有多个网络通过路由器相互连接起来,构成一个更大的计算机网络称为互联网 4.网络把许多计算机连接在一起,互联网把许多网络通过一些路由器连接在一起,与网络相连的计算机称为…