SpringBoot web 服务多个数据源只有一个工作
SpringBoot web services multiple data sources only one working
我使用 Spring Boot 框架开发了两个 Web 服务,并将它们放在同一个项目中。每个 web 服务使用不同的数据库,比如 ws1 使用 Oracle1 而 ws2 使用 Oracle2。我已经用 beans 定义定义了一个 DataBaseConfig,但是当我 运行 这个应用程序时,它总是运行一个网络服务(而且它总是一样的)。
数据库配置
@Configuration
public class DataBaseConfig {
@Bean(name = "ora1")
@ConfigurationProperties(prefix="spring.datasource")
public DataSource mysqlDataSource() {
return DataSourceBuilder.create().build();}
@Bean(name = "ora2")
@ConfigurationProperties(prefix="spring.secondDatasource")
public DataSource sqliteDataSource() {
return DataSourceBuilder.create().build();}
@Bean(name = "clients")
@Autowired
@ConfigurationProperties(prefix = "spring.datasource")
@Qualifier("datasource")
public JdbcTemplate slaveJdbcTemplate(DataSource datasource) {
return new JdbcTemplate(datasource); }
@Bean(name = "places")
@Autowired
@Primary
@ConfigurationProperties(prefix = "spring.secondDatasource")
@Qualifier("secondDatasource")
public JdbcTemplate masterJdbcTemplate(DataSource secondDatasource) {
return new JdbcTemplate(secondDatasource);}
}
我有包含 sql 语句和定义
的服务定义
@Service
public class ClientsService {
@Autowired
@Qualifier("clients")
private JdbcTemplate jdbcTemplate;
和其他服务
@Service
public class PlacesService {
@Autowired
@Qualifier("places")
private JdbcTemplate jdbcTemplate;
然后在每个控制器中我都取消映射@RequestMapping。当我 运行 应用程序时,我没有与连接相关的错误,如果我将 web 服务分开在 2 个项目中,每个都可以正常工作。
这里有些地方出了问题,包括一些不必要的注释。见下文,注意@Qualifier 的位置和限定符名称:
@Bean(name = "clients")
public JdbcTemplate slaveJdbcTemplate(@Qualifier("ora1") DataSource datasource) {
return new JdbcTemplate(datasource);
}
@Bean(name = "places")
@Primary
public JdbcTemplate masterJdbcTemplate(@Qualifier("ora2") DataSource secondDatasource) {
return new JdbcTemplate(secondDatasource);
}
为什么不使用构造函数注入并在配置 class 中创建服务(沟 @Service
注解)。像往常一样创建 DataSource
和 JdbcTemplate
bean,不要给它们任何名称(默认是方法名称),同时创建 new PlacesService(placesJdbcTemplate())
。结果是代码简单了很多。
这是假设您希望两个数据库在运行时都处于活动状态。如果不是,请使用 @Profile
.
我使用 Spring Boot 框架开发了两个 Web 服务,并将它们放在同一个项目中。每个 web 服务使用不同的数据库,比如 ws1 使用 Oracle1 而 ws2 使用 Oracle2。我已经用 beans 定义定义了一个 DataBaseConfig,但是当我 运行 这个应用程序时,它总是运行一个网络服务(而且它总是一样的)。
数据库配置
@Configuration
public class DataBaseConfig {
@Bean(name = "ora1")
@ConfigurationProperties(prefix="spring.datasource")
public DataSource mysqlDataSource() {
return DataSourceBuilder.create().build();}
@Bean(name = "ora2")
@ConfigurationProperties(prefix="spring.secondDatasource")
public DataSource sqliteDataSource() {
return DataSourceBuilder.create().build();}
@Bean(name = "clients")
@Autowired
@ConfigurationProperties(prefix = "spring.datasource")
@Qualifier("datasource")
public JdbcTemplate slaveJdbcTemplate(DataSource datasource) {
return new JdbcTemplate(datasource); }
@Bean(name = "places")
@Autowired
@Primary
@ConfigurationProperties(prefix = "spring.secondDatasource")
@Qualifier("secondDatasource")
public JdbcTemplate masterJdbcTemplate(DataSource secondDatasource) {
return new JdbcTemplate(secondDatasource);}
}
我有包含 sql 语句和定义
的服务定义@Service
public class ClientsService {
@Autowired
@Qualifier("clients")
private JdbcTemplate jdbcTemplate;
和其他服务
@Service
public class PlacesService {
@Autowired
@Qualifier("places")
private JdbcTemplate jdbcTemplate;
然后在每个控制器中我都取消映射@RequestMapping。当我 运行 应用程序时,我没有与连接相关的错误,如果我将 web 服务分开在 2 个项目中,每个都可以正常工作。
这里有些地方出了问题,包括一些不必要的注释。见下文,注意@Qualifier 的位置和限定符名称:
@Bean(name = "clients")
public JdbcTemplate slaveJdbcTemplate(@Qualifier("ora1") DataSource datasource) {
return new JdbcTemplate(datasource);
}
@Bean(name = "places")
@Primary
public JdbcTemplate masterJdbcTemplate(@Qualifier("ora2") DataSource secondDatasource) {
return new JdbcTemplate(secondDatasource);
}
为什么不使用构造函数注入并在配置 class 中创建服务(沟 @Service
注解)。像往常一样创建 DataSource
和 JdbcTemplate
bean,不要给它们任何名称(默认是方法名称),同时创建 new PlacesService(placesJdbcTemplate())
。结果是代码简单了很多。
这是假设您希望两个数据库在运行时都处于活动状态。如果不是,请使用 @Profile
.