Spring启动 – 如何配置多个数据源

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

我试过设置这样的东西。

application.properties

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 getBasicStudentInfo(String MAIL) { return jdbc.queryForMap(GET_BASIC_STUDENT_INFO, new Object[]{MAIL}); } 

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

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

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

如果某些事情不清楚或需要我的一些解释或需要更多代码,我可以提供。 任何帮助解决这种情况将不胜感激。谢谢

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

您的配置类将如下所示:

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类中,你可以像这样自动assemblyJdbcTemplate:

 @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 getBasicStudentInfo(String MAIL) { return dJdbc.queryForMap(GET_BASIC_STUDENT_INFO, new Object[]{MAIL}); } . . . } 

注意:确保使用@Primary注释注释其中一个DataSource

我的设置:spring-boot版本1.2.5.RELEASE

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

因此,对于每个JDBC方法,您应该像这样匹配合格的数据源

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

无论你选择@Primary,每个JDBC都使用@Qualifier应该可以正常工作。 在存储库中自动assemblyjdbcTemplates,并使用@Qualifier也可以。

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

 @Repository public class DAOImpl implements DAOInterface { @Autowired @Qualifier("tOracle") private JdbcTemplate testJdbc; @Autowired @Qualifier("intOracle") private JdbcTemplate intJdbc; @Override public Map 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}); } }