2022-05-29更新Spring Boot 1.5.8。RELEASE应该与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
or
@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);
}
这应该足够了。参见上面链接中的示例和详细信息。