【问题标题】:Spring boot connection to more then 2 data sourceSpring Boot 连接到超过 2 个数据源
【发布时间】:2018-04-17 21:08:08
【问题描述】:

我目前正在开发 Spring Boot 项目,我需要连接到 2 个以上的数据源(实际上是 4 个)。 我发现了许多如何连接到 2 DS 的示例,并且它可以工作,但是当我以相同的方式添加下一个时,它就不起作用了:

...init 方法调用失败;嵌套异常是 java.lang.IllegalArgumentException: Not a managed type: class...

对数据源有什么限制吗? 或者可以连接2个以上的DS吗?

【问题讨论】:

  • 如果你包含一个代码示例可能会有很大帮助。
  • 你总是有 4 个还是可以改变?尝试多租户方法也许不是一个坏主意。检查here
  • 嗨。问题解决了。请在下面阅读我的答案。谢谢

标签: spring spring-boot connection datasource


【解决方案1】:

创建任意数量的数据源。我知道没有限制。它只是另一个豆子。Refer here

#first db
spring.datasource.url = [url]
spring.datasource.username = [username]
spring.datasource.password = [password]
spring.datasource.driverClassName = oracle.jdbc.OracleDriver

#second db ...
spring.secondDatasource.url = [url]
spring.secondDatasource.username = [username]
spring.secondDatasource.password = [password]
spring.secondDatasource.driverClassName = oracle.jdbc.OracleDriver


@Bean("firstds")
@ConfigurationProperties(prefix="spring.datasource")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}

@Bean("secondds")
@ConfigurationProperties(prefix="spring.secondDatasource")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}

【讨论】:

    【解决方案2】:

    补充@Surya 所说的

    第一步:如前所述在application.properties文件中设置数据库配置。

    第 2 步:您需要创建一个 bean。在您的情况下,您需要创建 2 个单独的 bean,指向 2 个差异数据源。

     @Bean("firstds")
    @ConfigurationProperties(prefix="spring.datasource")
    public DataSource primaryDataSource() {
    return DataSourceBuilder.create().build();
    } 
    
    
    @Bean("secondds")
    @ConfigurationProperties(prefix="spring.secondDatasource")
    public DataSource secondaryDataSource() {
    return DataSourceBuilder.create().build();
    }
    

    你可以在一个类中创建这 2 个 bean。

    现在想知道如何使用这个 bean!

    @Autowired
      @Qualifier("firstds")
      NamedParameterJdbcTemplate            firstConnection;
     result = firstConnection.query(Your query goes here)
    

    以上查询将始终通过您创建的 bean 访问第一个 db。 同样,您可以使用连接通过第二个 bean 访问 db 2。

    【讨论】:

      【解决方案3】:

      感谢您的帮助。 实际上我做的所有配置都是正确的,但是......(一个小的拼写错误全部崩溃:)) 当我开始包含我的代码时,我发现它已修复,现在一切正常。 但这是我的代码作为示例(也许有人会使用它:))

      所有三个实体和存储库(Shadow、Main、Project)都以完全相同的方式配置,所以我只放了一次。 (唯一的区别是 Main 的 DS 是 @Primary。

      谢谢。 BR

      application.properties

      #-------------------------- first
      spring.datasource.url=jdbc:mysql://
      spring.datasource.username=
      spring.datasource.password=
      spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
      
      #-------------------------- second
      second.datasource.url=jdbc:mysql://
      second.datasource.username=
      second.datasource.password=
      second.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
      
      #-------------------------- third
      third.datasource.url=jdbc:mysql://
      third.datasource.password=
      third.datasource.username=
      third.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
      

      Shadow.java

      package com.server.shadow.domain;
      
      import ...
      
      @Entity
      @Table(name = "shadow")
      public class Shadow {
      
          @Id
          private String id;
          private String shadow;
      
          public Shadow(){}
      
         //getters and setters
      }
      

      ShadowRepository.java

      package com.server.shadow.repo;
      
      import ...
      
      @Repository
      public interface ShadowRepository extends JpaRepository<Shadow,Long> {
      }
      

      ShadowDbConf.java

      package com.server;
      
      import ...
      
      @Configuration
      @EnableTransactionManagement
      @EnableJpaRepositories(entityManagerFactoryRef = "shadowEntityManagerFactory",
              transactionManagerRef = "shadowTransactionManager",
              basePackages = {"com.server.shadow.repo"}
      )
      public class ShadowDbConf {
      
           @Bean(name = "shadowDataSource")
          @ConfigurationProperties(prefix = "second.datasource")
          public DataSource dataSource() {
              return DataSourceBuilder.create().build();
          }
      
          @Bean(name = "shadowEntityManagerFactory")
          public LocalContainerEntityManagerFactoryBean
          shadowEntityManagerFactory(
                  EntityManagerFactoryBuilder builder,
                  @Qualifier("shadowDataSource") DataSource dataSource
          ) {
              return
                      builder
                              .dataSource(dataSource)
                              .packages("com.server.shadow.domain")
                              .persistenceUnit("shadow")
                              .build();
          }
          @Bean(name = "shadowTransactionManager")
          public PlatformTransactionManager shadowTransactionManager(
                  @Qualifier("shadowEntityManagerFactory") EntityManagerFactory
                          shadowEntityManagerFactory
          ) {
              return new JpaTransactionManager(shadowEntityManagerFactory);
          }
      }
      

      MainController.java

      package com.server;
      
      import ...
      
      @RestController
      public class MainController {
      
          private final ShadowRepository shadowRepository;
          private final MainRepository mainRepository;
          private final PojectRepository projectRepository;
      
          @Autowired
          MainController(ShadowRepository shadowRepository, MainRepository mainRepository,PojectRepository projectRepository) {
              this.shadowRepository = shadowRepository;
              this.mainRepository = mainRepository;
              this.projectRepository = projectRepository;
          }
      
          @GetMapping(path = "/shadow")
          public @ResponseBody Iterable<Shadow> getShadows(){
              return shadowRepository.findAll();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-11
        • 2020-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-13
        • 2019-12-16
        相关资源
        最近更新 更多