Как настроить несколько источников данных в Spring Data JDBC?

Я пытаюсь заменить некоторые проекты, чтобы использовать Spring Data JDBC вместо использования JdbcTemplate,

Теперь я хотел бы использовать его для нескольких DataSources, как я могу настроить его в 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 Основные моменты:

  1. Переместите сущности и репозитории в отдельные пакеты для каждого источника данных.
  2. Настроить соединения с базой данных.
      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
  1. Настройте каждый репозиторий 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 знает, какой источник данных необходим.

В настоящее время нет поддержки для работы с двумя или более DataSources. Вы должны вручную повторить то, что JdbcRepositoryFactoryBean делает.

Другие вопросы по тегам