Java Spring引导-如何配置多个数据源

Java Spring引导-如何配置多个数据源,java,spring-boot,jdbctemplate,Java,Spring Boot,Jdbctemplate,我正在尝试使用SpringBoot设置多个数据源(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.d

我正在尝试使用SpringBoot设置多个数据源(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);
   }
}
@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);
   }
}
OracleConfiguration.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);
   }
}
@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实现中使用如下配置

@Bean(name = "dJdbc")
public JdbcTemplate drupalJdbcTemplate(@Qualifier("dMySql") DataSource dMySql) {
    return new JdbcTemplate(dMySql);
}
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});
}
@存储库
公共类DAOImpl实现DAOImpl接口{
@自动连线
@限定词(“dJdbc”)
私有jdbc模板jdbc;
@凌驾
公共地图getBasicStudentInfo(字符串邮件){
返回jdbc.queryForMap(获取基本的学生信息,新对象[]{MAIL});
}
我怎么做呢?我确实看过很多关于多个数据源的文章,但不幸的是,这些例子或解决方案并不适合我

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

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


如果有什么不清楚的地方,或者需要我的解释,或者需要更多的代码,我可以提供。如果有任何帮助来解决这种情况,我将不胜感激。谢谢您的DAO,您可以连接其他jdbctemplates。然后在运行时,您可以选择使用哪一个

@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});       
    }
}
@存储库
公共类DAOImpl实现DAOImpl接口{
@自动连线
@限定词(“触须”)
私有jdbc模板testJdbc;
@自动连线
@限定词(“不可调”)
私有jdbc模板intJdbc;
@凌驾
公共映射getBasicStudentInfo(字符串邮件,字符串源){
如果(“测试”。等于(源)){
返回testJdbc.queryForMap(获取基本的学生信息,新对象[]{MAIL});
}否则{
返回intJdbc.queryForMap(获取基本的学生信息,新对象[]{MAIL});
}
}

我的设置:spring boot版本1.2.5.0发布版

我成功地运行了这样的设置,通过在每个jdbc方法创建中添加@Qualifier,使用正确的数据源创建jdbc

因此,对于每个JDBC方法,您都应该像下面这样匹配符合条件的数据源

@Bean(name = "dJdbc")
public JdbcTemplate drupalJdbcTemplate(@Qualifier("dMySql") DataSource dMySql) {
    return new JdbcTemplate(dMySql);
}
无论您选择@Primary,为每个JDBC使用@Qualifier都应该很好。
在存储库中自动连接jdbcTemplates,并对其使用@Qualifier也可以。

以下是解决您问题的完整解决方案…

您的配置类将如下所示:

@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});
    }

    .
    .
    .
}
MySqlConfiguration.java

OracleConfiguration.java

在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});
    }

    .
    .
    .
}
@存储库
公共类DAOImpl实现DAOImpl接口{
@自动连线
@限定词(“dJdbc”)
私有jdbc模板dJdbc;
@自动连线
@限定词(“mJdbc”)
私有jdbc模板;
@自动连线
@限定词(“tOracleJdbc”)
私有jdbc模板和jdbc;
@自动连线
@限定词(“jdbc”)
私有jdbc模板和jdbc;
@凌驾
公共地图getBasicStudentInfo(字符串邮件){
返回dJdbc.queryForMap(获取基本的学生信息,新对象[]{MAIL});
}
.
.
.
}

注意:请确保使用@Primary annotation注释其中一个数据源。我要注意,我在混合使用带有JdbcTemplates的数据源和不带JdbcTemplates的数据源时遇到了问题。我发现最好遵循以下示例,即每个数据源都在配置文件中定义了其JdbcTemplate。@Shrikant Salgar我使用的是spring boot 2.0是my application.properties details spring.datasource app.driver class name=com.microsoft.sqlserver.jdbc.SQLServerDriver spring.datasource app.url=xxxx,但由于jdbcUrl是driverClassName@VikasKalapurSpring2.0使用defaul提供的HikariCP数据源t,它需要JDBCURL配置参数名。所以将您的配置更改为spring.datasource app.jdbc url=xxxx并重试。