spring mybits plus动态切换数据库
以前的做法可能是,在我们配置文件定义多个datasource,然后在dao中根据增、删、改、查去选择不同的datasource。这样做的话,可能就需要我们在代码里面硬编码选择数据源的过程,这样做显然不够友好,会产生很多冗余,重复的代码。
那有没有可以让我们的程序自动去选择路由数据源,而我代码中还是像以前那样,只关心业务逻辑,至于怎么选,选什么全都交给框架去实现。这样做的话,是不是瞬间感觉到代码清晰了很多了。那下面我们就来一步一步的实现看看。
用到的技术
- spring提供的 AbstractRoutingDataSource 类。该类就是在多数据源下,会根据determineCurrentLookupKey() 这个方法返回的路由key,在动态选择数据源
- spring AOP。需要在执行sql的方法前拦截请求,把该线程请求的方法,类名,参数等信息设置到线程局部变量(ThreadLocal)里面,然后determineCurrentLookupKey这个方法就可以根据线程的数据动态的选择数据源了。
代码
配置默认数据库(主数据库), FilterThreadLocalContext
拦截所有请求, 截取请求的域名,设置线程变量ThreadLocal
查找切换那个数据库.
DBConfigure.java
1 |
|
FilterThreadLocalContext.java
1 |
|
MultipleDataSource.java
程序启动查询数据库数据源, 添加到数据源里面.
1 |
|
RoutingDataSource.java
最重要的, 查询sql前 调用 determineCurrentLookupKey
,切换要执行的数据库.
1 |
|
数据库脚本
主数据库,dynamic_main
1 |
|
子数据库, dynamic_1
1 |
|
子数据库, dynamic_2
1 |
|
Gitee
https://gitee.com/zhaops_learning/spring-cloud-learning/tree/master/spring-mybits-dynamic-datasource