Spring Boot数据访问之多数据源配置及数据源动态切换
对于一个数据源的配置在Spring Boot数据访问之数据源自动配置 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)和Spring Boot数据访问之Druid连接池的配置 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中均有涉及,不同之处在于数据库连接池不一样:前者有Spring Boot提供,后者使用第三方提供的数据库连接池。
如果一个数据库数据量过大,考虑到分库分表和读写分离需要动态的切换到相应的数据库进行相关操作,这样就会有多个数据源。实际业务访问的是哪个数据源怎么合理有效的处理呢?
上图中2就是实际生产中会遇到的情况,可以看到多个数据源对应了多个SessionFactory。可不可以多个数据源只有一个SessionFactory呢?答案是可以的,Spring Boot为实现该模式提供了便利。
首先多数据源配置:
测试案例:pojo之类的就不截图了,仅截图测试类如下:
测试结果:
实际上两个数据库中的数据并不一样:
但是测试时访问的都是master数据库。那slave数据库根本无法访问到,实际生产中肯定在某些时候一定访问slave,这么解决呢?办法就是动态切换数据源。Spring内置了一个AbstractRoutingDataSource帮助完成动态数据源切换。下面先看这个抽象类:
阅读源码可知其中一个核心的方法setTargetDataSourcese,它需要一个Map进行赋值。这个Map存储的就是我们配置的多个数据源的键值对。其切换数据源的运作方式就是在连接数据库之前执行determineCurrentLookupKey方法返回的数据作为key去targetDataSources中查找相应的值,找到就用此DataSource获取数据库链接。
此类是抽象类,如果使用话需创建其的一个子类并实现获取key的方法determineCurrentLookupKey——即写我们自己的规则获取相应数据源。以上面的测试案例示例:
重写determineCurrentLookupKey:
配置类中增加主数据源配置:
修改测试案例:
测试结果:
上述动态切换数据源还可以优化,具体参考Spring Boot数据访问之声明式动态数据源切换