Весной Загрузитесь,проходитьAbstractRoutingDataSource
Реализация нескольких источников данныхсоединятьэто обычная практика。Этот метод позволяет динамически переключать источники данных во время выполнения.,Это поддерживает операции с несколькими базами данных. Весна Загрузитесь Конфигурацияи использоватьAbstractRoutingDataSource
来Реализация нескольких источников данныхсоединять。
pom.xml
Зависимости файлов,напримерSpring Data JPA и драйвер базы данных:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- Другие зависимости -->
</dependencies>
существоватьapplication.yml
илиapplication.properties
середина Конфигурация Информация из нескольких источников данных。Например:
spring:
datasource:
primary:
url: jdbc:mysql://localhost:3306/primary_db
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
secondary:
url: jdbc:mysql://localhost:3306/secondary_db
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
Создайте два класса конфигурации источника данных, чтобы настроить первичный источник данных и вторичный источник данных соответственно.
@Configuration
public class DataSourceConfig {
@Bean(name = "primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "secondaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
}
РасширятьAbstractRoutingDataSource
добрый,И динамически возвращайте источник данных на основе контекстной информации.
public class DynamicRoutingDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDataSourceType();
}
}
Используется для установки и получения текущего типа источника данных во время выполнения.
public class DataSourceContextHolder {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
public static void setDataSourceType(String dataSourceType) {
contextHolder.set(dataSourceType);
}
public static String getDataSourceType() {
return contextHolder.get();
}
public static void clearDataSourceType() {
contextHolder.remove();
}
}
Настройте источник данных в контексте Spring и укажите источник данных по умолчанию.
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
basePackages = "com.example.repository",
entityManagerFactoryRef = "entityManagerFactory",
transactionManagerRef = "transactionManager"
)
public class DataSourceRoutingConfig {
@Autowired
@Qualifier("primaryDataSource")
private DataSource primaryDataSource;
@Autowired
@Qualifier("secondaryDataSource")
private DataSource secondaryDataSource;
@Bean
public DataSource dataSource() {
DynamicRoutingDataSource routingDataSource = new DynamicRoutingDataSource();
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put("primary", primaryDataSource);
targetDataSources.put("secondary", secondaryDataSource);
routingDataSource.setTargetDataSources(targetDataSources);
routingDataSource.setDefaultTargetDataSource(primaryDataSource);
return routingDataSource;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
EntityManagerFactoryBuilder builder) {
return builder
.dataSource(dataSource())
.packages("com.example.entity")
.persistenceUnit("multiple-pu")
.build();
}
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
Тип источника данных устанавливается перед выполнением метода через АОП и очищается после выполнения метода.
@Aspect
@Component
public class DataSourceAspect {
@Before("@annotation(targetDataSource)")
public void changeDataSource(JoinPoint point, TargetDataSource targetDataSource) throws Throwable {
DataSourceContextHolder.setDataSourceType(targetDataSource.value());
}
@After("@annotation(targetDataSource)")
public void clearDataSource(JoinPoint point, TargetDataSource targetDataSource) {
DataSourceContextHolder.clearDataSourceType();
}
}
НастроитьаннотацияTargetDataSource
:
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface TargetDataSource {
String value();
}
существовать需要使用特定数据源的方法илидобрый上使用@TargetDataSource
аннотация。
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@TargetDataSource("primary")
public User findUserById(Long id) {
return userRepository.findById(id).orElse(null);
}
@TargetDataSource("secondary")
public User findUserBySecondaryId(Long id) {
// Предположим, что база данных-получатель имеет аналогичную структуру таблиц.
return userRepository.findById(id).orElse(null);
}
}
Подпишитесь на общедоступный аккаунт [код тридцать пять], чтобы получить дополнительную техническую информацию!