spring boot 自动装配会通过 spring.datasource.*
为我们自动装配数据源,所以想要动态的切换数据源,第一件事是配置数据源,其次是怎么切换?最后何时切换?
原理解析(使用 AbstractRoutingDataSource 实现)
spring-jdbc 提供了 AbstractRoutingDataSource
在 getConnection()
时通过 lookup key
决定目标数据源,使用 AbstractRoutingDataSource 需要准备至少两个数据源,这在源码中也有体现:
一个默认数据源 + 动态匹配的数据源,resolvedDataSources
是一个 Object
为 key,DataSource
为 value 的 Map,可见这里 key 即充当了 lookup key
的角色。
在调用 getConnection
获取数据源时会调用 determineTargetDataSource
方法获取目标数据源,进而通过 determineCurrentLookupKey
方法获得当前的 lookup key
,再从 resolvedDataSources
中获得目标数据源。
AbstractRoutingDataSource
是一个抽象类,determineCurrentLookupKey
是其唯一的抽象方法,意味着子类只需在适当的时候修改当前的 lookup key
就能实现动态的更改当前的数据源。
配置数据源
配置数据源也就是给 AbstractRoutingDataSource
的 defaultTargetDataSource
和 resolvedDataSources
进行赋值。
这里我们将数据源配置在 properties 文件中,通过工具类解析进行配置。
在 properties 中配置数据源
demo 项目为 spring boot 项目,配置文件采用 yml 格式:
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/db?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false
username: root
password: 1234
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
multi: