动态数据源的原理得先说清
原理
平常在使用Mysql的时候是通过JDBC的,得给一个url,userName,和password,如下:
jdbc:mysql://localhost:3306/t_db1?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
复制代码
一个url对应一个Connection对象,需要在url中指定需要连接的库。编程学习资料点击免费领取
之后的Mysql的CRUD的操作都是通过Connection对象来做的。所以,动态,就是在这个时候操作的,在获取Connection的时候来通过指定的key来判断要用哪个数据源。这得有一个前提,得先建立Connection,之后在获取Connection的时候在判断,
-
通过什么判断呢?存放key和Connection的数据结构是什么?
只要指定一个回调方法,key随便,存放key和Connection的数据结构是Map。在获取Connection的时候,先确定Key,在获取Connection就好了。
再看Spring
Java连接Mysql指定了接口,需要实现DataSource
接口,Spring中提供了抽象类(AbstractDataSource
)
解释说明
DriverManagerDataSource
这个没有什么可说,只是封装了一下连接mysql需要用的一些属性,比如userName,password,url,driver,就是就老一套的获取Connection封装了一下
AbstractRoutingDataSource
Spring提供的动态数据源的抽象类
首先,它里面有一个Map,Map的key是Object(这是自定义的),V是Object(虽然是Object,代码里面规定了,只能为String,和DataSource),其实它本质就应该是DataSource,这里是String的目的是为了可以通过DataSourceLookup
来获取数据源。(比如,可以在配置数据源的时候,直接配置数据源的bean的名字,然后自己写一个DataSourceLookup的实现类,从BeanFactory中获取DataSource)。
还提供了一个determineCurrentLookupKey()
方法来判断当前数据源的key,其实就是map中的key。在最终获取Connection的时候通过当前的key获取DataSource,在通过DataSource获取真正的Connection。
代码分析
- 属性