Вопрос проверяет понимание конфигурации и работы с несколькими источниками данных в Spring приложении.
DataSource — это интерфейс, предоставляющий подключение к базе данных. В Spring Boot обычно используется один DataSource, но в сложных проектах может потребоваться несколько источников данных, например, для разделения чтения и записи или для работы с разными БД.
Spring Boot автоматически настраивает один DataSource, EntityManager и TransactionManager. Если добавить второй DataSource, возникнет конфликт бинов. Spring не сможет определить, какой из них использовать по умолчанию, что приведет к ошибкам при запуске.
Необходимо вручную создать бины для каждого источника данных. Один из них нужно пометить как @Primary, чтобы Spring использовал его для автоматических инъекций. Для каждого DataSource создаются свои EntityManagerFactory и PlatformTransactionManager.
@Configuration
public class DataSourceConfig {
@Primary
@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();
}
@Primary
@Bean(name = "primaryEntityManager")
public LocalContainerEntityManagerFactoryBean primaryEntityManager(
EntityManagerFactoryBuilder builder,
@Qualifier("primaryDataSource") DataSource dataSource) {
return builder
.dataSource(dataSource)
.packages("com.example.primary.entity")
.persistenceUnit("primary")
.build();
}
@Bean(name = "secondaryEntityManager")
public LocalContainerEntityManagerFactoryBean secondaryEntityManager(
EntityManagerFactoryBuilder builder,
@Qualifier("secondaryDataSource") DataSource dataSource) {
return builder
.dataSource(dataSource)
.packages("com.example.secondary.entity")
.persistenceUnit("secondary")
.build();
}
}Такая конфигурация используется в микросервисах, где один сервис обращается к нескольким базам данных, или в системах с разделением на读写 (read/write) реплики.
Вывод: Работа с несколькими DataSource требует явной конфигурации и указания primary бина. Это позволяет гибко управлять подключениями к разным БД, но увеличивает сложность настройки и поддержки.