springcloud多数据源

参考:廖雪峰博客

1.**application

标签必须添加,否则出现加载数据源无限循环
@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)
@Bean("masterDataSource")
@ConfigurationProperties(prefix = "spring.datasource")
DataSource masterDataSource() {
    System.out.println("create master datasource...");
    return DataSourceBuilder.create().build();
}

/**
 * Slave (read only) data source.
 */
@Bean("slaveDataSource")
@ConfigurationProperties(prefix = "spring.datasourceRed")
DataSource slaveDataSource() {
    System.out.println("create slave datasource...");
    return DataSourceBuilder.create().build();
}

@Primary
@Bean
DataSource primaryDataSource(
        @Autowired @Qualifier("masterDataSource") DataSource masterDataSource,
        @Autowired @Qualifier("slaveDataSource") DataSource slaveDataSource
) {
    System.out.println("create routing datasource...");
    Map<Object, Object> map = new HashMap<>();
    map.put("masterDataSource", masterDataSource);
    map.put("slaveDataSource", slaveDataSource);
    RoutingDataSource routing = new RoutingDataSource();
    routing.setTargetDataSources(map);
    routing.setDefaultTargetDataSource(masterDataSource);
    return routing;
}

2.RoutingDataSource.java

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

/**
 * @author:Administrator
 */
public class RoutingDataSource extends AbstractRoutingDataSource {

    @Override
    protected Object determineCurrentLookupKey() {
        return RoutingDataSourceContext.getDataSourceRoutingKey();
    }
}

3.RoutingDataSourceContext.java

/**
 * @author:Administrator
 */
public class RoutingDataSourceContext {
    // holds data source key in thread local:
    static final ThreadLocal<String> threadLocalDataSourceKey = new ThreadLocal<>();

    public static String getDataSourceRoutingKey() {
        String key = threadLocalDataSourceKey.get();
        return key == null ? "masterDataSource" : key;
    }

    public RoutingDataSourceContext(String key) {
        threadLocalDataSourceKey.set(key);
    }

    public void close() {
        threadLocalDataSourceKey.remove();
    }
}

4.RoutingAspect.java

import com.pcitc.aims.project.common.config.RoutingDataSourceContext;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

/**
 * @author:Administrator
 * @date:2019/12/30
 */
@Aspect
@Component
public class RoutingAspect {
    @Around("@annotation(routingWith)")
    public Object routingWithDataSource(ProceedingJoinPoint joinPoint, RoutingWith routingWith) throws Throwable {
        try {
            String key = routingWith.value();
            RoutingDataSourceContext ctx = new RoutingDataSourceContext(key);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            return joinPoint.proceed();
        }
    }
}

5.RoutingWith.java

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author:Administrator
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RoutingWith {
    String value() default "";
}
在Spring Cloud中使用多数据源可以通过配置多个数据源以及分别配置对应的事务管理器来实现。以下是一种常见的实现方式: 首先,在Spring Boot的配置文件中,配置多个数据源的相关信息。例如,可以使用以下配置: ```properties # 数据源1 spring.datasource.url=jdbc:mysql://localhost:3306/db1 spring.datasource.username=user1 spring.datasource.password=pass1 # 数据源2 spring.datasource.db2.url=jdbc:mysql://localhost:3306/db2 spring.datasource.db2.username=user2 spring.datasource.db2.password=pass2 ``` 接下来,在项目中创建对应的数据源配置类。可以使用`@Configuration`注解标记该类为配置类,然后使用`@Bean`注解配置多个数据源。例如: ```java @Configuration public class DataSourceConfig { @Primary @Bean(name = "dataSource1") @ConfigurationProperties(prefix = "spring.datasource") public DataSource dataSource1() { return DataSourceBuilder.create().build(); } @Bean(name = "dataSource2") @ConfigurationProperties(prefix = "spring.datasource.db2") public DataSource dataSource2() { return DataSourceBuilder.create().build(); } } ``` 在上述配置类中,使用了`@Primary`注解来标记数据源1为主要数据源,这样在注入数据源时会优先选择数据源1。 接着,在需要使用数据源的地方,可以使用`@Qualifier`注解指定具体的数据源。例如,可以在Repository层的代码中使用`@Qualifier`注解指定具体的数据源: ```java @Repository public class UserRepository { private final JdbcTemplate jdbcTemplate; @Autowired public UserRepository(@Qualifier("dataSource1") DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } // ... } ``` 以上就是使用Spring Cloud实现多数据源的一种方式。通过配置多个数据源以及使用`@Qualifier`注解指定具体的数据源,可以实现在不同的业务场景下使用不同的数据源。 相关问题: 1. 如何在事务管理中使用多数据源? 2. 是否可以动态切换数据源? 3. 多数据源会带来哪些挑战和注意事项?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值