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

时间:2018-04-17 21:08:09

标签: spring spring-boot connection datasource

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

...调用init方法失败;嵌套异常是java.lang.IllegalArgumentException:不是托管类型:class ...

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

3 个答案:

答案 0 :(得分:2)

创建所需数量的数据源。我没有任何限制。它只是另一个bean。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();
}

答案 1 :(得分: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。

答案 2 :(得分: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();
    }
}