spring boot 动态数据源配置 & 运行时新增数据源
场景:
- 同一系统支持不同业务场景,需要用到不同的数据库。
- 各个用户/应用之间数据完全隔离(不同的用户/应用,不同的数据库),而一个程序需要支持不同的用户/应用。例如 一些paas服务需要支持不同的业务场景,但是不同项目之间数据、账号、权限、token等业务数据都是完全隔离的,仅共享机器资源。
一、spring boot 动态数据源配置
方案:在一个确切的地方存储 数据源的配置信息(我是将这些信息存储在一个 配置数据库表中,而这个配置数据库是确切的,作为主数据源配置)。启动spring时,会初始化这个配置数据源,然后将其他动态数据源信息取出来初始化好datasource 注册到spring 容器。
原理:主要是实现AbstractRoutingDataSource的抽象类,然后将该类注册到spring容器,其中关键点是:
- 配置AbstractRoutingDataSource类的默认数据源
Object defaultTargetDataSource
和其他数据源Map<Object, Object> targetDataSources
。targetDataSources就是我们动态配置的数据源,key-value 接口,后面根据key 查找 datasource - 实现determineCurrentLookupKey()方法,该方法决定了当前操作选择哪个数据源
- 注册到spring 容器