首页 文章

Spring引导连接到2个以上的数据源

提问于
浏览
0

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

...Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class...

对数据源有任何限制吗?或者是否可以连接到2个以上的DS?

3 回答

  • 0

    加上@Surya说的话

    步骤1:如上所述在application.properties文件中设置数据库配置 .

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

    @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命中第一个数据库 . 类似地,您可以使用连接通过第二个bean命中db 2 .

  • 1

    创建所需数量的数据源 . 我没有任何限制 . 这只是另一种 beans 子 . 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();
    }
    
  • 0

    谢谢你的帮助 . 实际上我做了所有的配置,但...(一个小拼错崩溃所有:))当我开始包括我的代码我发现它,修复,现在一切正常 . 但这里是我的代码示例(也许有人会使用它:))

    所有三个实体和存储库(Shadow,Main,Project)都以完全相同的方式配置,因此我只将它放置一次 . (唯一的区别是主要的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();
        }
    }
    

相关问题