# dynamicDataSourceSwitcher **Repository Path**: tmq777/dynamic-dataSource-switcher ## Basic Information - **Project Name**: dynamicDataSourceSwitcher - **Description**: 动态数据源切换的starter - **Primary Language**: Java - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2022-03-03 - **Last Updated**: 2022-03-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: Java, SpringBoot ## README # dynamicDataSourceSwitcher #### 介绍 动态数据源切换的starter,在使用主从结构时,可以动态配置当前线程即将要使用的数据源。 #### 开发环境 - jdk 11.0.10 - SpringBoot 2.6.2 - Idea ### 使用方法 1. #### 引入本jar包 ```xml cn.t.dynamic dataSource-switcher-spring-boot-starter 1.0.0 ``` 2. #### 在`@Configuration`配置类中创建动态数据源的`Bean` ```java @Autowired private DynamicDataSource dynamicDataSource; ``` 3. #### 在为类似`mybatis`框架配置数据源时,使用`dynamicDataSource`即可 多数据源配置可参考官网 > https://docs.spring.io/spring-boot/docs/2.4.2/reference/html/howto.html#howto-two-datasources 1. ##### 数据源需要自己配置生成,配置过程中可高度定制化。 ```java //ds1... @Bean("prop1") @ConfigurationProperties(prefix = "spring.datasource.datasource1") public DataSourceProperties dsProp1() { return new DataSourceProperties(); } @Bean(name = "dataSource1") @Primary // 该注解标注的数据源会被认为是master public DataSource dataSource1() { // 可以自定义一些属性,比如连接池的设置 return dsProp1().initializeDataSourceBuilder().build(); } // ds2.... ``` 2. ##### 配置事务和`sessionFactory`时注入**动态数据源** ```java // 以事务配置举例 @Bean(name = "sf1") @Primary public PlatformTransactionManager txManager1(DynamicDataSource dataSource) { DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource); // 事务10秒超时 transactionManager.setDefaultTimeout(10); return transactionManager; } ``` 4. #### 切换数据源(编码方式) 1. 切换`master` `DynamicDataSourceContextHolder.master()` 2. 切换`slave` `DynamicDataSourceContextHolder.slave()` 3. 指定`slave` `DynamicDataSourceContextHolder.slave(String)` 4. 指定存在的数据源 `DynamicDataSourceContextHolder.specify(String)` ```java public voud func() { // 切换数据源 DynamicDataSourceContextHolder.master(); // DynamicDataSourceContextHolder.slave(); // do something // ... // !!!清除缓存 DynamicDataSourceContextHolder.reset(); } ``` 完成逻辑后**一定**要调用`DynamicDataSourceContextHolder.reset()`清除缓存 5. #### 切换数据源(注解方式) 1. 切换`master` ```java @Dynamic public void demo() { } ``` ```java @Dynamic(type = DataSourceType.MASTER) public void demo() { } ``` ```java // 当类型指定为MASTER时,key任意,因为主数据源只有一个 @Dynamic(target = "any key", type = DataSourceType.MASTER) public void demo() { } ``` 2. 切换`slave` ```java // 指定一个从数据源,target必须存在且类型为从数据源 @Dynamic(target = "ds2", type = DataSourceType.SLAVE) public void demo() { } ``` ```java // 随机选取一个从数据源 @Dynamic(type = DataSourceType.SLAVE) public void demo() { } ``` 3. 指定数据源 ```java // 指定一个数据源,target必须存在 @Dynamic(target = "ds2") public void demo() { } ``` > 注意`DataSourceType.DEFAULT`不需要手动设置