springboot+dynamicDataSource動態(tài)添加切換數(shù)據(jù)源方式
springboot dynamicDataSource動態(tài)添加切換數(shù)據(jù)源
之前有篇寫了切換數(shù)據(jù)源的方法,那些可以在yml中配置固定的幾個數(shù)據(jù)源進行切換后面需要新需求 在數(shù)據(jù)庫實現(xiàn)增刪改查數(shù)據(jù)源 然后連。
之前配置的就不說了自行查看http://www.dbjr.com.cn/article/233975.htm
1.修改初始加載的數(shù)據(jù)源map
之前傳獲取的tagetData是直接讀取yml中的多個數(shù)據(jù)源。此時我寫了dataTest方法調用主數(shù)據(jù)直接查詢數(shù)據(jù)庫里的某張表 并把表中內容加載成一個個數(shù)據(jù)源放到map中
2.此時一開始的時候就會加載數(shù)據(jù)庫中的
一張表的數(shù)據(jù)信息作為數(shù)據(jù)源。
3.但是發(fā)現(xiàn)新增數(shù)據(jù)源或修改數(shù)據(jù)源時無法操作
需要重啟服務,后面發(fā)現(xiàn)DynamicDataSource中有一個Map變量用于存儲數(shù)據(jù)源,在調用其構造函數(shù)時候有進行加載
只要修改了這個map那么新增或者修改的map也可以生效了,完結。
dynamicDataSource動態(tài)添加移除數(shù)據(jù)源
數(shù)據(jù)源model
import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; @Data public class DataSourceDTO { @NotBlank @ApiModelProperty(value = "連接池名稱", example = "db1") private String poolName; @NotBlank @ApiModelProperty(value = "JDBC driver", example = "com.mysql.cj.jdbc.Driver") private String driverClassName; @NotBlank @ApiModelProperty(value = "JDBC url 地址", example = "jdbc:mysql://x.x.x.x:3306/x?useUnicode=true&characterEncoding=utf-8") private String url; @NotBlank @ApiModelProperty(value = "JDBC 用戶名", example = "sa") private String username; @ApiModelProperty(value = "JDBC 密碼") private String password; }
切換接口
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; import com.baomidou.dynamic.datasource.creator.*; import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty; import com.lets.web.vo.common.DataSourceDTO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.sql.DataSource; import java.util.Set; @RestController @RequestMapping("/datasources") @Api(tags = "添加刪除數(shù)據(jù)源") public class DataSourceController { @Autowired private DataSource dataSource; @Autowired private DefaultDataSourceCreator dataSourceCreator; @Autowired private DruidDataSourceCreator druidDataSourceCreator; @Autowired private HikariDataSourceCreator hikariDataSourceCreator; @GetMapping @ApiOperation("獲取當前所有數(shù)據(jù)源") public Set<String> now() { DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource; return ds.getDataSources().keySet(); } //通用數(shù)據(jù)源會根據(jù)maven中配置的連接池根據(jù)順序依次選擇。 //默認的順序為druid>hikaricp>beecp>dbcp>spring basic @PostMapping("/add") @ApiOperation("通用添加數(shù)據(jù)源(推薦)") public Set<String> add(@Validated @RequestBody DataSourceDTO dto) { DataSourceProperty dataSourceProperty = new DataSourceProperty(); BeanUtils.copyProperties(dto, dataSourceProperty); DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource; DataSource dataSource = dataSourceCreator.createDataSource(dataSourceProperty); ds.addDataSource(dto.getPoolName(), dataSource); return ds.getDataSources().keySet(); } @PostMapping("/addDruid") @ApiOperation("基礎Druid數(shù)據(jù)源") public Set<String> addDruid(@Validated @RequestBody DataSourceDTO dto) { DataSourceProperty dataSourceProperty = new DataSourceProperty(); BeanUtils.copyProperties(dto, dataSourceProperty); dataSourceProperty.setLazy(true); DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource; DataSource dataSource = druidDataSourceCreator.createDataSource(dataSourceProperty); ds.addDataSource(dto.getPoolName(), dataSource); return ds.getDataSources().keySet(); } @PostMapping("/addHikariCP") @ApiOperation("基礎HikariCP數(shù)據(jù)源") public Set<String> addHikariCP(@Validated @RequestBody DataSourceDTO dto) { DataSourceProperty dataSourceProperty = new DataSourceProperty(); BeanUtils.copyProperties(dto, dataSourceProperty); dataSourceProperty.setLazy(true);//3.4.0版本以下如果有此屬性,需手動設置,不然會空指針。 DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource; DataSource dataSource = hikariDataSourceCreator.createDataSource(dataSourceProperty); ds.addDataSource(dto.getPoolName(), dataSource); return ds.getDataSources().keySet(); } @DeleteMapping @ApiOperation("刪除數(shù)據(jù)源") public String remove(String name) { DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource; ds.removeDataSource(name); return "刪除成功"; } }
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- springboot集成@DS注解實現(xiàn)數(shù)據(jù)源切換的方法示例
- SpringBoot?+DynamicDataSource切換多數(shù)據(jù)源的全過程
- Springboot實現(xiàn)根據(jù)用戶ID切換動態(tài)數(shù)據(jù)源
- Springboot動態(tài)切換數(shù)據(jù)源的具體實現(xiàn)與原理分析
- 詳細聊聊SpringBoot中動態(tài)切換數(shù)據(jù)源的方法
- Spring配置多數(shù)據(jù)源切換
- SpringBoot AOP方式實現(xiàn)多數(shù)據(jù)源切換的方法
- Spring配置多個數(shù)據(jù)源并實現(xiàn)數(shù)據(jù)源的動態(tài)切換功能
相關文章
Mybatis實現(xiàn)動態(tài)SQL編寫詳細代碼示例
這篇文章主要為大家詳細介紹了Mybatis中動態(tài)SQL的編寫使用,動態(tài)SQL技術是一種根據(jù)特定條件動態(tài)拼裝SQL語句的功能,它存在的意義是為了解決拼接SQL語句字符串時的痛點問題,感興趣想要詳細了解可以參考下文2023-05-05