java 动态切换数据源_Java动态切换数据源(AOP)

一、对比

通过中间层来管理数据源,常用的有 mycat 等,但有一个大缺陷,就是性能的损耗,即本身直接请求数据库的事儿,却要经过中间层来进行一次分配的操作,但是,通用性比较高。

而使用客户端模式来管理数据源,直连数据库,就没有那一部分的性能损耗,但是不够通用,而且如果业务足够复杂时,对数据库的连接处理也并不 easy。

二、实现 ①自定义数据源

目录结构概览:

采用 springboot 来实现本操作,所以下文见到的都是注解的形式。

① 配置两个数据源

② 使用 ThreadLocal 保存数据源,目的是保证当前数据源在当前线程中不被其它线程修改

③ 写个动态数据源的实现,需要继承 Spring 给我们提供的 AbstractRoutingDataSource 抽象类

其实就是个路由。

④ 完成动态数据源的对象的申明 (bean)

三、实现 ②自定义AOP

申明一个 AOP 切面,我们的做法是在 repository 层进行数据源的切换,完成后移除数据源的名称。

四、实现 ③动态切换

① 自定义注解,该注解使用目标是 dao 层方法

② dao 层方法上加注解,没有加的就使用默认的 数据库连接

五、测试效果

① 自定义实体类

② 写测试类,查十次,奇数次查默认数据库,否则查 test2 数据库

③ 结果,如下图,在查 test2 数据库的时候,进行了连接处的初始化动作

六、总结

本文采用的是 Spring 中的 AbstractRoutingDataSource和 AOP来实现动态数据源的切换,如此简单的操作可以满足大部分基础的切换动作。

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