【Spring】【Mybatis】【Dynamic-Datasource】【事务】Spring + MyBaits + 事务 + 动态数据源 四者是如何协调的呢?(从一个数据库连接串一串四者的联系)

1  前言

我上次有一篇是讲了从一个数据库连接的角度分析了 Spring + MyBaits + 事务三者的联系https://www.cnblogs.com/kukuxjx/p/17861966.html,这是在数据源固定的情况下。那么可能会遇到,比如按租户的分库,这种情况下我们会引入动态的数据源比如 苞米豆团队的 Dynamic-Datasource 或者是自己公司内部封装的工具、框架等,这节我们就以 Dynamic-Datasource 为例,来看看动态数据源的情况下,我们的事务、Mybatis 又是如何关联到一起的。

2  固定数据源下的关系

在看之前,我们先看看固定数据源下的,连接获取的一个过程:

当然所经过的类,肯定不止上边这么几个哈,我只简要的画了几个重要的类在图上,可以看到最后 mybatis 执行的时候,连接的获取,先从上下文中获取连接,如果有的话就用当前上下文中的,没有的话就从数据源中获取一个连接进行执行。

3  动态数据源下的关系

在串联动态数据源下时,我们得先看看 Dynamic-Datasource 都主要做了哪些内容。我这里引入的 3.0.0 版本的哈。

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>

配置了两个数据源:

# 默认数据源
spring.datasource.dynamic.primary = master
# master 数据源
spring.datasource.dynamic.datasource.master.type = com.zaxxer.hikari.HikariDataSource
spring.datasource.dynamic.datasource.master.url = jdbc:postgresql://localhost:5432/test
spring.datasource.dynamic.datasource.master.username = postgres
spring.datasource.dynamic.datasource.master.password = xxx
spring.datasource.dynamic.datasource.master.driver-class-name = org.postgresql.Driver

spring.datasource.dynamic.datasource.test01.type = com.zaxxer.hikari.HikariDataSource
spring.datasource.dynamic.datasource.test01.url = jdbc:postgresql://localhost:5432/shiyanjidi
spring.datasource.dynamic.datasource.test01.username = postgres
spring.datasource.dynamic.datasource.test01.password = xxx
spring.datasource.dynamic.datasource.test01.driver-class-name = org.postgresql.Driver

我们看看 starter 的自动装配类:

其中引入了一个重要的数据源:DynamicRoutingDataSource:

看一看它的类图关系:

再看我们上边的图里,从数据源中获取连接,而这里的 DynamicRoutingDataSource 获取连接的过程如下图:

可以这么理解,它自定义了一个数据源,内部有一个 dataSourceMap,会预先把所有的数据源都加载进这个 mao 里,然后获取连接的时候,根据当前的上下文对象也就是 DynamicDataSourceContextHolder,如果设置了就获取你指定的数据源,没有设置的话就会获取 Primary 的数据源哈。

那么上边的图,我们整体来看一下:

 具体的 DynamicRoutingDataSource 是如何加载所有的数据源,以及如何动态的添加数据源,不是我们这节的重点哈,后续我会单独写一套 DynamicDatasource 里的内容哈, 我们这节是串联一下他们的关系哈。

4  小结

好啦,本节就看到这里哈,有理解不对的地方欢迎指正哈。

posted @ 2024-02-19 17:47  酷酷-  阅读(319)  评论(0编辑  收藏  举报