Spring Boot 配置和使用两个数据源

如何配置和使用两个数据源?

例如,以下是我对第一个数据源的内容:

应用程序.属性

#first db
spring.datasource.url = [url]
spring.datasource.username = [username]
spring.datasource.password = [password]
spring.datasource.driverClassName = oracle.jdbc.OracleDriver

#second db ...

应用程序类

@SpringBootApplication
public class SampleApplication
{
    public static void main(String[] args) {
        SpringApplication.run(SampleApplication.class, args);
    }
}

如何修改以添加其他数据源?如何自动连接它以供其他存储库使用?application.properties


答案 1

给你。

添加到您的 application.properties 文件中:

#first db
spring.datasource.url = [url]
spring.datasource.username = [username]
spring.datasource.password = [password]
spring.datasource.driverClassName = oracle.jdbc.OracleDriver

#second db ...
spring.secondDatasource.url = [url]
spring.secondDatasource.username = [username]
spring.secondDatasource.password = [password]
spring.secondDatasource.driverClassName = oracle.jdbc.OracleDriver

添加使用以下方法@Configuration注释的任何类:

@Bean
@Primary
@ConfigurationProperties(prefix="spring.datasource")
public DataSource primaryDataSource() {
    return DataSourceBuilder.create().build();
}

@Bean
@ConfigurationProperties(prefix="spring.secondDatasource")
public DataSource secondaryDataSource() {
    return DataSourceBuilder.create().build();
}

答案 2

使用Spring Boot 1.5.8.RELEASE更新2022-05-29,它应该与Spring Boot 2.x一起使用

大多数答案没有提供如何使用它们(作为数据源本身和作为事务),只提供如何配置它们。

此外,您应该知道如何同时提交/回滚两个数据源的事务。

您可以在 https://github.com/surasint/surasint-examples/tree/master/spring-boot-jdbi/10_spring-boot-two-databases 中看到可运行的示例和一些解释(请参阅在README中可以尝试的内容.txt)

我在这里复制了一些代码。

首先,您必须像这样设置应用程序属性

#Database
database1.datasource.url=jdbc:mysql://localhost/testdb
database1.datasource.username=root
database1.datasource.password=root
database1.datasource.driver-class-name=com.mysql.jdbc.Driver

database2.datasource.url=jdbc:mysql://localhost/testdb2
database2.datasource.username=root
database2.datasource.password=root
database2.datasource.driver-class-name=com.mysql.jdbc.Driver

然后将它们定义为提供程序(@Bean),如下所示:

@Bean(name = "datasource1")
@ConfigurationProperties("database1.datasource")
@Primary
public DataSource dataSource(){
    return DataSourceBuilder.create().build();
}

@Bean(name = "datasource2")
@ConfigurationProperties("database2.datasource")
public DataSource dataSource2(){
    return DataSourceBuilder.create().build();
}

请注意,我有 和 ,那么当我们需要数据源时,您可以使用它作为 和 ,例如@Bean(name="datasource1")@Bean(name="datasource2")@Qualifier("datasource1")@Qualifier("datasource2")

@Qualifier("datasource1")
@Autowired
private DataSource dataSource;

如果你确实关心事务,你必须为它们两个定义DataSourceTransactionManager,如下所示:

@Bean(name="tm1")
@Autowired
@Primary
DataSourceTransactionManager tm1(@Qualifier ("datasource1") DataSource datasource) {
    DataSourceTransactionManager txm  = new DataSourceTransactionManager(datasource);
    return txm;
}

@Bean(name="tm2")
@Autowired
DataSourceTransactionManager tm2(@Qualifier ("datasource2") DataSource datasource) {
    DataSourceTransactionManager txm  = new DataSourceTransactionManager(datasource);
    return txm;
}

然后你可以像这样使用它

@Transactional //this will use the first datasource because it is @primary

@Transactional("tm2")

最重要的部分,你几乎不会在任何地方找到一个例子:如果你想要一个方法来提交/回滚两个数据库的事务,你需要Tm1和tm2的ChainedTransactionManager,如下所示:

@Bean(name = "chainedTransactionManager")
public ChainedTransactionManager getChainedTransactionManager(@Qualifier ("tm1") DataSourceTransactionManager tm1, @Qualifier ("tm2") DataSourceTransactionManager tm2){
    return new ChainedTransactionManager(tm1, tm2);
}

要使用它,请将此注释添加到方法中,例如@Transactional(value=“chainedTransactionManager”)

@Transactional(value="chainedTransactionManager")
public void insertAll() {
    UserBean test = new UserBean();
    test.setUsername("username" + new Date().getTime());
    userDao.insert(test);

    userDao2.insert(test);
}

这应该足够了。请参阅上面链接中的示例和详细信息。


推荐