一、对比
通过中间层来管理数据源,常用的有 mycat 等,但有一个大缺陷,就是性能的损耗,即本身直接请求数据库的事儿,却要经过中间层来进行一次分配的操作,但是,通用性比较高。
而使用客户端模式来管理数据源,直连数据库,就没有那一部分的性能损耗,但是不够通用,而且如果业务足够复杂时,对数据库的连接处理也并不 easy。
</p>
二、实现 ①自定义数据源
目录结构概览:
采用 springboot 来实现本操作,所以下文见到的都是注解的形式。
① 配置两个数据源
② 使用 ThreadLocal 保存数据源,目的是保证当前数据源在当前线程中不被其它线程修改
③ 写个动态数据源的实现,需要继承 Spring 给我们提供的 AbstractRoutingDataSource 抽象类
其实就是个路由。
④ 完成动态数据源的对象的申明 (bean)
三、实现 ②自定义AOP
申明一个 AOP 切面,我们的做法是在 repository 层进行数据源的切换,完成后移除数据源的名称。
四、实现 ③动态切换
① 自定义注解,该注解使用目标是 dao 层方法
② dao 层方法上加注解,没有加的就使用默认的 数据库连接
五、测试效果
① 自定义实体类
② 写测试类,查十次,奇数次查默认数据库,否则查 test2 数据库
③ 结果,如下图,在查 test2 数据库的时候,进行了连接处的初始化动作
六、总结
本文采用的是 Spring 中的 AbstractRoutingDataSource 和 AOP 来实现动态数据源的切换,如此简单的操作可以满足大部分基础的切换动作。