你可以使用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.MAIN和DatabaseType.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中连接不同的数据库。