SpringBoot动态数据源实现

发布于:2024-04-03 ⋅ 阅读:(117) ⋅ 点赞:(0)

一、背

一个应用难免需要连接多个数据库,像我们系统起码连接了5个以上数据库,AWS RDS主库,ECS自搭MySQL从库,工厂系统三个SQLServer数据库,在线网站MySQL数据库,记得很早以前是用SessionFactory配置(只有模糊的印象了),  下面介绍一下在Spring boot通过AOP的方式实现动态数据源切换。

二、基础知识点

1、AbstractRoutingDataSource

AbstractRoutingDataSource是Spring-jdbc提供一个继承自AbstractDataSource的抽象类。

AbstractRoutingDataSource 关键属性

  • targetDataSources:存放Key和数据库连接映射关系

  • defaultTargetDataSource:  默认连接

  • resolvedDataSources:这个数据是通过targetDataSources构建而成,也是存放Key和数据库连接映射关系。

AbstractRoutingDataSource 关键方法

  • afterPropertiesSet:在初始化Bean时就会执行,将外部传入的targetDataSources构建为内部的resolvedDataSources。

  • determineTargetDataSource:获取数据库连接getConnection方法会调用determineTargetDataSource来创建连接,它决定Spring容器使用的是哪一个连接。

  • determineCurrentLookupKey:抽像方法,一个扩展点,由子类实现,获取连接标识。

2、DynamicDataSource

          自定义动态数据源类

  • 继承AbstractRoutingDataSource

  • 用ThreadLocal<String>存放当前线程的数据源标识

  •  实现determineCurrentLookupKey方法获得当前数据源标记

3、DataSourceAspect

利用AOP进行数据源切换,DataSourceAspect类会去获取Service方法上的注解,如果没有注解则使用默认数据源,否则得到注解上的name,调用DynamicDataSource将数据源标识设置进去,然后调用Service方法该线程就使用该数据源。

三、实现代码

1、application.properties

2、DynamicDataSource 自定义动态数据源类

图片

3、DataSourceConfig 数据源配置类

将数据源配置注入到DynamicDataSource类

4、DataSourceNames 数据源注解名定义

5、DataSourceAspect 

6、业务类


网站公告

今日签到

点亮在社区的每一天
去签到