我是Spring和Spring Boot的新手 . 如何配置和使用两个数据源 .
例如,这是第一个数据源的内容 .
application.properties
#first db
spring.datasource.url = [url]
spring.datasource.username = [username]
spring.datasource.password = [password]
spring.datasource.driverClassName = oracle.jdbc.OracleDriver
#second db ...
Application class
@SpringBootApplication
public class SampleApplication {
private static final Logger logger = LoggerFactory.getLogger(SampleApplication.class);
public static void main(String[] args) {
SpringApplication.run(SampleApplication.class, args);
}
@Autowired
SampleRepository repo;
@PostConstruct
public void testDriving(){
logger.debug(repo.findSomeSample("id", "other"));
}
}
如何修改application.properties以添加其他数据源?如何将其自动装配以供其他仓库使用?
8 回答
干得好
参考the official documentation
创建多个数据源与创建第一个数据源的工作方式相同 . 如果您使用JDBC或JPA的默认自动配置(那么任何@Autowired注入将获取一个),您可能希望将其中一个标记为@Primary .
Update 2018-01-07 with Spring Boot 1.5.8.RELEASE
大多数答案没有提供如何使用它们(作为数据源本身和事务),只提供如何配置它们 .
您可以在https://www.surasint.com/spring-boot-with-multiple-databases-example/中看到可运行的示例和一些说明
我在这里复制了一些代码 .
首先,您必须像这样设置application.properties
然后将它们定义为提供者(@Bean),如下所示:
请注意,我有@Bean(name =“datasource1”)和@Bean(name =“datasource2”),那么当我们需要数据源为@Qualifier(“datasource1”)和@Qualifier(“datasource2”)时,你可以使用它,例如
如果您关心事务,则必须为它们定义DataSourceTransactionManager,如下所示:
然后就可以使用它了
要么
这应该足够了 . 请参阅上面链接中的示例和详细信息 .
这是完整的解决方案
由于我们要访问两个不同的数据库(db1,db2),我们需要单独配置每个数据源配置,如:
Second Datasource :
在这里你可以在我的博客上找到完整的例子:Spring Boot with Multiple DataSource Configuration
我使用了mybatis - springboot 2.0技术堆栈,解决方案:
注意:1)@ Primary-> @primary
2)--- . "jdbc-url" in properties - > After Spring Boot 2.0 migration: jdbcUrl is required with driverClassName
如果两个数据源位于同一个数据库位置/服务器上,则对下面的方法使用@Primary注释时效果很好 .
如果数据源位于不同的服务器上,则最好使用@Component和@Primary注释 . 以下代码段适用于不同位置的两个不同数据源
My requirement was slightly different but used two data sources.
我为同一个包中的相同JPA实体使用了两个数据源 . 一个用于在服务器启动时执行DDL以创建/更新表,另一个用于在运行时用于DML .
执行DDL语句后应关闭DDL连接,以防止在代码中的任何位置进一步使用超级用户previlleges .
属性
数据源配置类
// DDL数据源的第一个Config类
// DML数据源的第二个Config类
//在代码中使用DDL数据源 .
//在代码中使用DML数据源 .