Java动态切换数据源(AOP)

在此记录动态切换数据源的一些小操作。其实切换数据源在小项目中并不会出现,只有在一些分库等需要连接不同数据库的时候才会出现,一般情况下,有两种解决问题的大方向,一是通过数据库中间件来切换数据源,二是在我们的客户端,即 Java 代码中实现数据源的切换。

一、对比

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

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

二、实现 ①自定义数据源

        源码地址

       目录结构概览:

            dynamic-datasource-aop(11).png

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

        ① 配置两个数据源

         

            

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

            dynamic-datasource-aop(03).png

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

            其实就是个路由。

            dynamic-datasource-aop(04).png

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

            dynamic-datasource-aop(05).png

三、实现 ②自定义AOP

        申明一个 AOP 切面,我们的做法是在 repository 层进行数据源的切换,完成后移除数据源的名称。dynamic-datasource-aop(06).png

四、实现 ③动态切换

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

            dynamic-datasource-aop(07).png

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

        dynamic-datasource-aop(08).png

五、测试效果

        ① 自定义实体类

            dynamic-datasource-aop(09).png

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

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

dynamic-datasource-aop(10).png


六、总结

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



------ 本文结束 感谢阅读 ------
0%