Spring启动 - 如何配置多个数据源 [英] Spring boot - how to configure multiple datasources
问题描述
我正在尝试使用Spring启动设置多个数据源(MySql,Postgres和Oracle)。我没有使用JPA。使用JdbcTemplate进行设置。
I am trying to setup multiple data sources(MySql, Postgres & Oracle) using Spring boot. I am not using JPA. Setting up with a JdbcTemplate.
我尝试过设置这样的东西。
I have tried setting up something like this.
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实现中使用这样的配置
I am not sure if the above is the correct way to go about this. When I use @Primary as per the boot docs, the Bean that has @Primary is always used. Then I use the configurations in my DAO implementations like this
其中一个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});
}
我该怎么做呢?我确实看到很多关于多个数据源的文章,但遗憾的是这些示例或解决方案并不适合我。
How do I go about doing this.? I did see many articles which is about mutliple datasources but unfortunately the examples or solutions don't suite me.
除此之外,我还需要能够查询数据库的数据。基于一些用户输入。因此,如果用户提供环境,例如test或int,我如何根据该输入触发正确的属性。
Further to this I need to be able to query against the DB's based on some user input. So if a user provides an environment e.g., "test" or "int", how can I trigger the correct properties based on that input.
我知道环境是@Autowired进入Spring启动我可以拦截用户输入,但不确定我应该如何在用户输入和DAO配置之间提供管道。
I understand that Environment is @Autowired into Spring boot and I can intercept the user input, but unsure how I should provide the plumbing between the user input and the DAO configurations.
如果某些事情不清楚或者需要我更多解释或需要更多代码,我可以提供。任何帮助解决这种情况将不胜感激。谢谢
If something is unclear or needs a bit more explanation from my side or need more code I can provide that. Any help to resolve this situation would be appreciated.Thanks
推荐答案
以下是您问题的完整解决方案...
Here is complete solution to your problem ...
您的配置类将如下所示:
Your configuration classes will look like this :
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像这样:
and in your DAO class , you can autowire the JdbcTemplate like this :
@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注释注释其中一个DataSource
这篇关于Spring启动 - 如何配置多个数据源的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!