Как настроить несколько источников данных в Spring Data JDBC?
Я пытаюсь заменить некоторые проекты, чтобы использовать Spring Data JDBC вместо использования JdbcTemplate
,
Теперь я хотел бы использовать его для нескольких DataSource
s, как я могу настроить его в Spring Data JDBC?
2 ответа
По состоянию на январь 2022 года поддержка нескольких источников данных в Spring Data JDBC еще не добавлена — https://github.com/spring-projects/spring-data-jdbc/issues/544.
Даже Spring Boot не поддерживает его из коробки, вы можете сделать это, настроив его самостоятельно. Вы можете найти примеры в Интернете, например , https://dba-presents.com/index.php/jvm/java/242-spring-data-jdbc-with-two-datasources Основные моменты:
- Переместите сущности и репозитории в отдельные пакеты для каждого источника данных.
- Настроить соединения с базой данных.
spring.datasource.jdbc-url=jdbc:mysql://localhost:3306/employees
spring.datasource.username=root
spring.datasource.password=password
spring.users-datasource.jdbc-url=jdbc:mysql://localhost:3306/users
spring.users-datasource.username=root
spring.users-datasource.password=password
- Настройте каждый репозиторий JDBC отдельно. Конфигурация связывает пакеты с соответствующими источниками данных.
@Configuration
@EnableJdbcRepositories(
basePackages = "com.dbapresents.twodatasources.dao.employees",
transactionManagerRef = "employeesTransactionManager",
jdbcOperationsRef = "employeesJdbcOperations"
)
@EnableAutoConfiguration(exclude = {
DataSourceAutoConfiguration.class,
JdbcRepositoriesAutoConfiguration.class
})
public class PersistenceEmployeesConfiguration {
@Bean
@ConfigurationProperties(prefix="spring.datasource")
DataSource employeesDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "employeesTransactionManager")
PlatformTransactionManager employeesTransactionManager(@Qualifier("employeesDataSource") DataSource employeesDataSource) {
return new JdbcTransactionManager(employeesDataSource);
}
@Bean
NamedParameterJdbcOperations employeesJdbcOperations(@Qualifier("employeesDataSource") DataSource dataSource) {
return new NamedParameterJdbcTemplate(dataSource);
}
}
@Configuration
@EnableJdbcRepositories(
basePackages = "com.dbapresents.twodatasources.dao.users",
transactionManagerRef = "usersTransactionManager",
jdbcOperationsRef = "usersJdbcOperations"
)
@EnableAutoConfiguration(exclude = {
DataSourceAutoConfiguration.class,
JdbcRepositoriesAutoConfiguration.class
})
public class PersistenceUsersConfiguration {
@Bean
@ConfigurationProperties(prefix="spring.users-datasource")
DataSource userDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "usersTransactionManager")
PlatformTransactionManager usersTransactionManager(@Qualifier("userDataSource") DataSource userDataSource) {
return new JdbcTransactionManager(userDataSource);
}
@Bean
NamedParameterJdbcOperations usersJdbcOperations(@Qualifier("userDataSource") DataSource dataSource) {
return new NamedParameterJdbcTemplate(dataSource);
}
@Bean
Dialect jdbcDialect() {
return MySqlDialect.INSTANCE;
}
@Bean
JdbcCustomConversions customConversions() {
return new JdbcCustomConversions();
}
@Bean
JdbcMappingContext jdbcMappingContext(Optional<NamingStrategy> namingStrategy, JdbcCustomConversions customConversions) {
JdbcMappingContext mappingContext = new JdbcMappingContext((NamingStrategy)namingStrategy.orElse(NamingStrategy.INSTANCE));
mappingContext.setSimpleTypeHolder(customConversions.getSimpleTypeHolder());
return mappingContext;
}
@Bean
JdbcConverter jdbcConverter(JdbcMappingContext mappingContext,
@Qualifier("usersJdbcOperations") NamedParameterJdbcOperations jdbcOperationsDataBase1,
@Lazy RelationResolver relationResolver,
JdbcCustomConversions conversions,
Dialect dialect) {
DefaultJdbcTypeFactory jdbcTypeFactory = new DefaultJdbcTypeFactory(jdbcOperationsDataBase1.getJdbcOperations());
return new BasicJdbcConverter(mappingContext, relationResolver, conversions, jdbcTypeFactory,
dialect.getIdentifierProcessing());
}
}
Когда вы выполняете метод в конкретном репозитории, благодаря конфигурации Spring знает, какой источник данных необходим.
В настоящее время нет поддержки для работы с двумя или более DataSource
s. Вы должны вручную повторить то, что JdbcRepositoryFactoryBean
делает.