多个DataSource仅引用Spring Boot中的一个数据库

时间:2018-06-13 15:52:54

标签: spring hibernate spring-boot datasource jdbctemplate

在我的应用程序中,我需要集成两个数据源,但是当我使用JdbcTemplate集成第二个数据库时,前一个数据库不工作,而是在第二个数据源中创建的所有表

#1 DataSource

@Configuration
@Profile("mariadb4j")
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class EmbeddedMariaDBConfig {
private static final Logger L = 
LoggerFactory.getLogger(EmbeddedMariaDBConfig.class);
private static final String DB_SERVICE = "dbServiceBean";

@Bean(name = {DB_SERVICE})
MariaDB4jSpringService mariaDB4jSpringService() {
    L.info("Initializing MariaDB4j service");
    return new MariaDB4jSpringService();
}

@Bean(name = "adminDataSource")
@Primary
@DependsOn(DB_SERVICE)
DataSource dataSource(MariaDB4jSpringService mdb, DataSourceProperties dataSourceProperties) throws ManagedProcessException {
    String dbName = dataSourceProperties.getName();
    L.debug("Embedded MariaDB datasource properties from spring: [{}]", dataSourceProperties);
    mdb.getDB().createDB(dbName);

    if(L.isDebugEnabled()) {
        DBConfigurationBuilder ecfg = mdb.getConfiguration();
        L.debug("JDBC URL for embedded MariaDB as reported by driver: [{}]", ecfg.getURL(dbName));
        L.debug("JDBC URL from spring config: [{}]", dataSourceProperties.getUrl());
        L.debug("JDBC Username: [{}]", dataSourceProperties.getUsername());
        L.debug("JDBC Password: [{}]", dataSourceProperties.getPassword());
    }

    return DataSourceBuilder
            .create()
            .username(dataSourceProperties.getUsername())
            .password(dataSourceProperties.getPassword())
            .url(dataSourceProperties.getUrl())
            .driverClassName(dataSourceProperties.getDriverClassName())
            .build();
  }
}

Yaml配置

spring:
  profiles: mariadb4j
  datasource:
   username: root
   password: password
   driver-class-name: com.mysql.jdbc.Driver
   url: jdbc:mysql://localhost:3306/t1
mariaDB4j:
 dataDir: /tmp/mariadb
 port: 3900

2 DataSource

@Configuration
public class ExoDBConfig {

@Bean(name="user")
public DataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost:3306/t2");
    dataSource.setUsername("root");
    dataSource.setPassword("password");
    return dataSource;
}

@Bean
public JdbcTemplate jdbcTemplate(@Qualifier("user")DataSource dataSource) 
 {
    return new JdbcTemplate(dataSource);
 }
}

当我只使用一个DataSource时,它正常工作并且表在 t1 数据库中创建但是当我集成第二个DataSource然后它指向第二个DataSource意味着所有表格正在 t2 数据库中创建。

1 个答案:

答案 0 :(得分:2)

只需在JdbcTemplate中创建DataSource对象,为我工作,您就可以为 t2 数据库创建单独的属性文件

    @Bean
public JdbcTemplate jdbcTemplate() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost:3306/t2");
    dataSource.setUsername("user");
    dataSource.setPassword("password");
    return new JdbcTemplate(dataSource);
}