【问题标题】:How to configure multiple datasources in Spring Data JDBC?如何在 Spring Data JDBC 中配置多个数据源?
【发布时间】:2018-09-29 13:23:09
【问题描述】:

我正在尝试替换一些项目以使用 Spring Data JDBC 而不是使用JdbcTemplate

现在,我想将它用于多个DataSources,如何在Spring Data JDBC中配置它?

【问题讨论】:

标签: spring spring-boot spring-data spring-data-jdbc


【解决方案1】:

截至 2022 年 1 月,尚未添加对 Spring Data JDBC 中多个数据源的支持 - https://github.com/spring-projects/spring-data-jdbc/issues/544

即使 Spring Boot 开箱即用也不支持,您可以通过自己配置来实现。您可以在 Internet 上找到示例,例如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 知道需要哪个数据源。

【讨论】:

    【解决方案2】:

    目前不支持使用两个或多个DataSources。您必须手动重做 JdbcRepositoryFactoryBean 所做的工作。

    【讨论】:

    • 是否可以将该构造函数公开?或者至少受到保护?上周我遇到了困难,我不能轻易解决这个问题。不想在类加载等期间遮盖类。
    • 反向链接问题以供将来参考:jira.spring.io/browse/DATAJDBC-321
    猜你喜欢
    • 1970-01-01
    • 2020-07-28
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 2020-03-16
    • 2018-04-12
    相关资源
    最近更新 更多