有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Spring boot如何配置多个数据源

我正在尝试使用Spring boot设置多个数据源(MySql、Postgres和Oracle)。我没有使用JPA。使用JdbcTemplate进行设置

我试过这样做

应用程序。属性

spring.datasource.test-oracle.username=test-oracle
spring.datasource.test-oracle.password=test-password
spring.datasource.test-oracle.url=dburl/test
spring.datasource.test-oracle.driver-class-name=oracle.jdbc.OracleDriver

spring.datasource.int-oracle.username=int-oracle
spring.datasource.int-oracle.password=int-password
spring.datasource.int-oracle.url=dburl/int
spring.datasource.int-oracle.driver-class-name=oracle.jdbc.driver.OracleDriver

spring.datasource.d.int-mysql.username=user
spring.datasource.d.int-mysql.password=password
spring.datasource.d.int-mysql.url=dburl/d
spring.datasource.d.int-mysql.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.m.int-mysql.username=user
spring.datasource.m.int-mysql.password=password
spring.datasource.m.int-mysql.url=dburl/m
spring.datasource.m.int-mysql.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.d.test-mysql.username=user
spring.datasource.d.test-mysql.password=password
spring.datasource.d.test-mysql.url=dburl/d
spring.datasource.d.test-mysql.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.m.test-mysql.username=user
spring.datasource.m.test-mysql.password=password
spring.datasource.m.test-mysql.url=dburl/m
spring.datasource.m.test-mysql.driver-class-name=com.mysql.jdbc.Driver

MySqlConfiguration。java

@Configuration
public class MySqlConfiguration() {

   @Bean(name = "dMySql")
   @ConfigurationProperties(prefix = "spring.datasource.d.int-mysql")
   public DataSource mysqlDrupalDataSource() {
     return DataSourceBuilder.create().build();
   }

   @Bean(name = "dJdbc")
   public JdbcTemplate drupalJdbcTemplate(DataSource dMySql) {
      return new JdbcTemplate(dMySql);
   }

   @Bean(name = "mMySql")
   @ConfigurationProperties(prefix = "spring.datasource.m.int-mysql")
   public DataSource mysqlDrupalDataSource() {
      return DataSourceBuilder.create().build();
   }

   @Bean(name = "mJdbc")
   public JdbcTemplate drupalJdbcTemplate(DataSource mMySql) {
      return new JdbcTemplate(mMySql);
   }
}

OracleConfiguration。java

@Configuration
public class OracleConfiguration {

   @Primary
   @Bean(name = "tOracle")
   @ConfigurationProperties(prefix = "spring.datasource.test-oracle")
   public DataSource heOracleDataSource() {
      return DataSourceBuilder.create().build();
   }

   @Bean(name = "tOracleJdbc")
   public JdbcTemplate jdbcTemplate(DataSource tOracle) {
      return new JdbcTemplate(tOracle);
   }

   @Bean(name = "iOracle")
   @ConfigurationProperties(prefix = "spring.datasource.int-oracle")
   public DataSource heOracleDataSource() {
      return DataSourceBuilder.create().build();
   }

   @Bean(name = "iOracleJdbc")
   public JdbcTemplate jdbcTemplate(DataSource iOracle) {
      return new JdbcTemplate(iOracle);
   }
}

我不确定上述方法是否正确。当我按照引导文档使用@Primary时,总是使用带有@Primary的Bean。然后我在DAO实现中使用如下配置

DAO的实现之一

@Repository
public class DAOImpl implements DAOInterface {

    @Autowired
    @Qualifier("dJdbc")
    private JdbcTemplate jdbc;

    @Override
    public Map<String, Object> getBasicStudentInfo(String MAIL) {
        return jdbc.queryForMap(GET_BASIC_STUDENT_INFO, new Object[]{MAIL});
}

我该怎么做呢。?我确实看过很多关于多个数据源的文章,但不幸的是,这些例子或解决方案并不适合我

除此之外,我需要能够根据一些用户输入查询数据库。因此,如果用户提供了一个环境,例如“test”或“int”,那么如何根据该输入触发正确的属性呢

我知道Environment是@Autowired到Spring boot的,我可以拦截用户输入,但不确定应该如何提供用户输入和DAO配置之间的管道

如果有什么不清楚的地方,或者我需要更多的解释,或者需要更多的代码,我可以提供。如能帮助解决此问题,我们将不胜感激。谢谢


共 (2) 个答案

  1. # 1 楼答案

    在DAO中,可以连接其他JDBC模板。然后在运行时,您可以选择使用哪一个

    @Repository
    public class DAOImpl implements DAOInterface {
    
    @Autowired
    @Qualifier("tOracle")
    private JdbcTemplate testJdbc;
    
    @Autowired
    @Qualifier("intOracle")
    private JdbcTemplate intJdbc;
    
    @Override
    public Map<String, Object> getBasicStudentInfo(String MAIL, String source) {
        if ("TEST".equals(source)){
              return testJdbc.queryForMap(GET_BASIC_STUDENT_INFO, new Object[]{MAIL});
        }else {
              return intJdbc.queryForMap(GET_BASIC_STUDENT_INFO, new Object[]{MAIL});       
        }
    }
    
  2. # 2 楼答案

    这是你问题的完整解决方案

    您的配置类将如下所示:

    MySqlConfiguration。java

    @Configuration
    public class MySqlConfiguration {
    
       @Bean(name = "dMySql")
       @ConfigurationProperties(prefix = "spring.datasource.d.int-mysql")
       public DataSource mysqlDrupalDataSource() {
         return DataSourceBuilder.create().build();
       }
    
       @Bean(name = "dJdbc")
       public JdbcTemplate drupalJdbcTemplate(@Qualifier("dMySql") DataSource dMySql) {
          return new JdbcTemplate(dMySql);
       }
    
       @Bean(name = "mMySql")
       @ConfigurationProperties(prefix = "spring.datasource.m.int-mysql")
       public DataSource mysqlDrupalDataSource() {
          return DataSourceBuilder.create().build();
       }
    
       @Bean(name = "mJdbc")
       public JdbcTemplate drupalJdbcTemplate(@Qualifier("mMySql") DataSource mMySql) {
          return new JdbcTemplate(mMySql);
       }
    }
    

    OracleConfiguration。java

    @Configuration
    public class OracleConfiguration {
    
       @Primary
       @Bean(name = "tOracle")
       @ConfigurationProperties(prefix = "spring.datasource.test-oracle")
       public DataSource heOracleDataSource() {
          return DataSourceBuilder.create().build();
       }
    
       @Bean(name = "tOracleJdbc")
       public JdbcTemplate jdbcTemplate(@Qualifier("tOracle") DataSource tOracle) {
          return new JdbcTemplate(tOracle);
       }
    
       @Bean(name = "iOracle")
       @ConfigurationProperties(prefix = "spring.datasource.int-oracle")
       public DataSource heOracleDataSource() {
          return DataSourceBuilder.create().build();
       }
    
       @Bean(name = "iOracleJdbc")
       public JdbcTemplate jdbcTemplate(@Qualifier("iOracle") DataSource iOracle) {
          return new JdbcTemplate(iOracle);
       }
    }
    

    在DAO类中,可以像这样自动连接JdbcTemplate:

    @Repository
    public class DAOImpl implements DAOInterface {
    
        @Autowired
        @Qualifier("dJdbc")
        private JdbcTemplate dJdbc;
    
        @Autowired
        @Qualifier("mJdbc")
        private JdbcTemplate mJdbc;
    
        @Autowired
        @Qualifier("tOracleJdbc")
        private JdbcTemplate tOracleJdbc;
    
        @Autowired
        @Qualifier("iOracleJdbc")
        private JdbcTemplate iOracleJdbc;
    
        @Override
        public Map<String, Object> getBasicStudentInfo(String MAIL) {
            return dJdbc.queryForMap(GET_BASIC_STUDENT_INFO, new Object[]{MAIL});
        }
    
        .
        .
        .
    }
    

    注意:确保用@Primary annotation注释其中一个数据源