当前位置:   article > 正文

springboot 动态多数据源_@switchdatasourcean

@switchdatasourcean

springboot 动态多数据源

 

应用:同一个应用中使用多个数据库,根据需要切换数据库

 

 

*********************

相关类与接口

 

AbstractRoutingDataSource

  1. public abstract class AbstractRoutingDataSource extends AbstractDataSource implements InitializingBean {
  2. ************
  3. 部分字段
  4. @Nullable
  5. private Map<Object, Object> targetDataSources; //目标数据源
  6. @Nullable
  7. private Object defaultTargetDataSource; //默认数据源
  8. ************
  9. 常用方法
  10. public void setTargetDataSources(Map<Object, Object> targetDataSources) {
  11. this.targetDataSources = targetDataSources;
  12. } //设置目标数据源
  13. public void setDefaultTargetDataSource(Object defaultTargetDataSource) {
  14. this.defaultTargetDataSource = defaultTargetDataSource;
  15. } //设置默认数据源
  16. @Nullable
  17. protected abstract Object determineCurrentLookupKey();
  18. //抽象方法,设置数据源的key

 

 

*********************

示例:同一应用中向不同的数据库中插入数据

 

数据库h1:表user

数据库h2:表person

 

******************

config 层

 

DynamicDatasource:动态数据源切换

  1. public class DynamicDataSource extends AbstractRoutingDataSource {
  2. private ThreadLocal<DataSource_Enum> threadLocal=new ThreadLocal<>();
  3. public void switchDataSource(DataSource_Enum dataSource_enum){
  4. threadLocal.set(dataSource_enum);
  5. }
  6. @Override
  7. protected Object determineCurrentLookupKey() {
  8. return threadLocal.get();
  9. }

 

DataConfig:配置数据源

  1. @Configuration
  2. @EnableAspectJAutoProxy
  3. @MapperScan("com.example.demo.dao")
  4. public class DataConfig {
  5. @Bean("one")
  6. @ConfigurationProperties("spring.datasource.druid.one")
  7. public DataSource initOneDataSource(){
  8. return DruidDataSourceBuilder.create().build();
  9. }
  10. @Bean("two")
  11. @ConfigurationProperties("spring.datasource.druid.two")
  12. public DataSource initSecondDataSource(){
  13. return DruidDataSourceBuilder.create().build();
  14. }
  15. @Bean
  16. @Primary
  17. public DynamicDataSource initDynamicDataSource(@Qualifier("one") DataSource ds1, @Qualifier("two") DataSource ds2){
  18. DynamicDataSource dynamicDataSource=new DynamicDataSource();
  19. Map<Object,Object> map=new HashMap<>();
  20. map.put(DataSource_Enum.one,ds1);
  21. map.put(DataSource_Enum.two,ds2);
  22. dynamicDataSource.setTargetDataSources(map);
  23. dynamicDataSource.setDefaultTargetDataSource(ds1);
  24. return dynamicDataSource;
  25. }

 

DataSource_Enum

  1. public enum DataSource_Enum{
  2. one,two
  3. }

 

*********************

aop 层

 

CustomAspect

  1. @Aspect
  2. @Component
  3. public class CustomAspect {
  4. @Resource
  5. private DynamicDataSource dataSource;
  6. @Pointcut("execution(* *..UserMapper.*(..))")
  7. public void funOne(){
  8. }
  9. @Pointcut("execution(* *..PersonMapper.*(..))")
  10. public void funTwo(){
  11. }
  12. @Before("funOne()")
  13. public void beforeOne(){ //使用UserMapper时,使用数据库:one
  14. dataSource.switchDataSource(DataSource_Enum.one);
  15. }
  16. @Before("funTwo()")
  17. public void beforeTwo(){ //使用PersonMapper时,使用数据库:two
  18. dataSource.switchDataSource(DataSource_Enum.two);
  19. }
  20. }

 

*********************

controller 层

 

UserController

  1. @RestController
  2. @RequestMapping("/user")
  3. public class UserController {
  4. @Resource
  5. private UserMapper userMapper;
  6. @RequestMapping("/save")
  7. public String save(){
  8. for (int i=0;i<10;i++){
  9. User user=new User();
  10. user.setName("瓜田李下 "+i);
  11. user.setAge(i%5+10);
  12. userMapper.insert(user);
  13. }
  14. return "success";
  15. }
  16. }

 

PersonController

  1. @RestController
  2. @RequestMapping("/person")
  3. public class PersonController {
  4. @Resource
  5. private PersonMapper personMapper;
  6. @RequestMapping("/save")
  7. public String save(){
  8. for (int i=0;i<10;i++){
  9. Person person=new Person();
  10. person.setName("海贼王 "+i);
  11. person.setAge(i%4+12);
  12. personMapper.insert(person);
  13. }
  14. return "success";
  15. }
  16. }

 

 

*********************

插入数据测试

 

表 user

              

 

表 person

              

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/133147
推荐阅读
相关标签
  

闽ICP备14008679号