首页 > 技术文章 > Spring Boot数据访问之多数据源配置及数据源动态切换

ilovebath 2021-11-23 19:44 原文

  如果一个数据库数据量过大,考虑到分库分表和读写分离需要动态的切换到相应的数据库进行相关操作,这样就会有多个数据源。对于一个数据源的配置在Spring Boot数据访问之数据源自动配置 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)Spring Boot数据访问之Druid连接池的配置 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中均有涉及,不同之处在于数据库连接池不一样:前者有Spring Boot提供,后者使用第三方提供的数据库连接池。

  那么对于多数据源的数据库应该如何配置呢?首先看最简单的多数据源配置:

    

     

     

   测试案例:pojo之类的就不截图了,仅截图测试类如下:

    

   测试结果:

    

   实际上两个数据库中的数据并不一样:

    

  但是测试时访问的都是master数据库。那slave数据库根本无法访问到,实际生产中肯定在某些时候一定访问slave,这么解决呢?动态切换数据源。

  Spring内置了一个AbstractRoutingDataSource帮助完成动态数据源切换。下面先看这个抽象类:

    

  阅读源码可知其中一个核心的方法setTargetDataSourcese,它需要一个Map。这个Map存储的就是我们配置的多个数据源的键值对。其切换数据源的运作方式就是在连接数据库之前执行determineCurrentLookupKey方法返回的数据作为key去targetDataSources中查找相应的值,找到就用此DataSource获取数据库链接。

  此类是抽象类,如果使用话,最有效的方式就是创建其的一个子类并实现获取key的方法determineCurrentLookupKey——即写我们自己的规则获取相应数据源。

   以上面的测试案例示例:

    重写determineCurrentLookupKey:

      

       

    配置类中增加主数据源配置:

      

     修改测试案例:

       

     测试结果:

      

   实现了数据源的动态切换。

 

 

 

 

 



推荐阅读