多数据源连接

173 阅读1分钟

你可以使用Spring框架的动态数据源来实现在Service中连接不同的数据库。以下是一个实现的示例代码:

首先,需要创建两个数据源配置类,分别用于主数据库和次数据库的配置。

import javax.sql.DataSource;

@Configuration
public class DatabaseConfig {

    @Primary
    @Bean(name = "mainDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.main")
    public DataSource mainDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "secondaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }
}

在这个示例中,mainDataSource配置了主数据库的数据源,secondaryDataSource配置了次数据库的数据源。

然后,创建一个动态数据源类来动态选择要使用的数据库。

public class DynamicDataSource extends AbstractRoutingDataSource {

    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceContextHolder.getDataSource();
    }
}

其中,DataSourceContextHolder是一个自定义的线程上下文类,用于在不同线程中保存要使用的数据源。

接下来,配置动态数据源的Bean。

@Configuration
public class DynamicDataSourceConfig {

    @Bean
    public DataSource dynamicDataSource(@Qualifier("mainDataSource") DataSource mainDataSource,
                                        @Qualifier("secondaryDataSource") DataSource secondaryDataSource) {
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put(DatabaseType.MAIN, mainDataSource);
        targetDataSources.put(DatabaseType.SECONDARY, secondaryDataSource);

        DynamicDataSource dynamicDataSource = new DynamicDataSource();
        dynamicDataSource.setTargetDataSources(targetDataSources);
        dynamicDataSource.setDefaultTargetDataSource(mainDataSource);

        return dynamicDataSource;
    }
}

在上述代码中,DynamicDataSourceConfig创建了一个DynamicDataSource实例,并设置了主数据源和次数据源。同时,根据需求可以添加更多的数据源。

最后,创建一个注解@CustomDataSource用于方法级别的动态数据源选择。

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomDataSource {

    DatabaseType value() default DatabaseType.MAIN;
}

定义了两个枚举常量DatabaseType.MAINDatabaseType.SECONDARY来表示主数据库和次数据库。

现在,你可以在Service方法中使用@CustomDataSource注解来指定要使用的数据库。

@Service
public class MyService {

    @Autowired
    private MyRepository myRepository;

    @Transactional
    public void methodUsingMainDataSource() {
        myRepository.methodUsingMainDataSource();
    }

    @CustomDataSource(DatabaseType.SECONDARY)
    @Transactional
    public void methodUsingSecondaryDataSource() {
        myRepository.methodUsingSecondaryDataSource();
    }
}

在上述示例中,methodUsingMainDataSource会使用主数据库,而methodUsingSecondaryDataSource会使用次数据库。

这样,通过配置动态数据源和注解,你可以在同一个Service中连接不同的数据库。