需求背景
去年底,公司项目有一个需求中有个接口需要用到平台、算法、大数据等三个不同数据库的数据进行计算、组装以及最后的展示,当时这个需求是另一个老同事在做,我只是负责自己的部分。
直到今年回来了,这个项目也做得差不多了,这会儿才有时间区仔细看同事的代码,是怎么去实现 多数据源动态切换 的。
扩展:当业务也来越复杂,数据量越来越庞大时,就可能会对数据库进行分库分表、读写分离等设计来减轻压力、提高系统性能,那么多数据源动态切换势必是必不可少!
经过了一星期零零碎碎的下班时间,从了解原理、实现、优化的过程,自己终于总算是弄出来了,接下来一起看看!
思考
-
如何让Spring知道我们配置了多个数据源?
-
配置了多个数据源后,Spring是如何决定使用哪一个数据源?
-
Spring是如何动态切换数据源?
分析及实现
- 配置多数据源信息
spring: datasource: local: database: local username: root password: jdbc-url: jdbc:mysql://ip:port/test_user?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC driver-class-name: com.mysql.cj.jdbc.Driver server: database: server username: root password: jdbc-url: jdbc:mysql://ip:port/test_user?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC driver-class-name: com.mysql.cj.jdbc.Driver
这是我的两个数据库:本地数据库+个人服务器数据库
服务器数据库
本地数据库
- Spring如何获取配置好的多个数据源信息?
Spring提供了三种方式进行获取
@Value注解获取(实体类需配合@Component),最简单,但当配置信息较多时,写起来比较繁琐
@ConfigurationProperties注解获取,需要定义前缀,可大批量获取配置信息
@Environment注解从Spring环境中获取,实现较为复杂,本人很少用
同事使用的方式是第一种方式,但是我个人觉得这样侵入性较大,每增加一个数据源,就要重新定义变量然后用