在某些场景下,我们需要在一个应用程序中使用多个数据库。Spring Boot 提供了简单而灵活的方式来配置多个数据源。
步骤
1. 添加相关依赖
首先,我们需要在 pom.xml
文件中添加以下依赖:
<dependencies>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
...
</dependencies>
2. 配置数据源
在 application.properties
(或 application.yml
)文件中配置数据源。
## 主数据源
spring.datasource.url=jdbc:mysql://localhost:3306/maindb
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
## 第二个数据源
datasource.secondary.url=jdbc:mysql://localhost:3306/secondarydb
datasource.secondary.username=root
datasource.secondary.password=password
datasource.secondary.driver-class-name=com.mysql.jdbc.Driver
3. 创建数据源配置类
创建一个用于配置数据源的类,例如 DataSourceConfig.java
。
@Configuration
@EnableTransactionManagement
public class DataSourceConfig {
@Primary
@Bean(name = "mainDataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource mainDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "secondaryDataSource")
@ConfigurationProperties(prefix = "datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
@Primary
@Bean(name = "entityManagerFactory")
public LocalContainerEntityManagerFactoryBean mainEntityManagerFactory(EntityManagerFactoryBuilder builder,
@Qualifier("mainDataSource") DataSource dataSource) {
return builder
.dataSource(dataSource)
.packages("com.example.maindb.entities")
.build();
}
@Bean(name = "secondaryEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory(EntityManagerFactoryBuilder builder,
@Qualifier("secondaryDataSource") DataSource dataSource) {
return builder
.dataSource(dataSource)
.packages("com.example.secondarydb.entities")
.build();
}
@Primary
@Bean(name = "transactionManager")
public PlatformTransactionManager mainTransactionManager(
@Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
@Bean(name = "secondaryTransactionManager")
public PlatformTransactionManager secondaryTransactionManager(
@Qualifier("secondaryEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
4. 使用多数据源
在需要使用数据源的地方,使用 @Qualifier
注解来指定使用哪个数据源。
@Service
public class MyService {
@Autowired
@Qualifier("mainEntityManagerFactory")
private EntityManagerFactory mainEntityManagerFactory;
@Autowired
@Qualifier("secondaryEntityManagerFactory")
private EntityManagerFactory secondaryEntityManagerFactory;
// 使用主数据源
public void doSomethingWithMainDataSource() {
EntityManager entityManager = mainEntityManagerFactory.createEntityManager();
// ...
}
// 使用第二个数据源
public void doSomethingWithSecondaryDataSource() {
EntityManager entityManager = secondaryEntityManagerFactory.createEntityManager();
// ...
}
}
总结
配置多数据源是在一个应用程序中使用多个数据库的常见需求。使用 Spring Boot 可以很容易地配置多个数据源,并且使用 @Qualifier
注解来指定具体使用哪个数据源。这种灵活性和简单性是 Spring Boot 的优势之一。
希望这篇博客对你有所帮助。如果你有任何问题或建议,欢迎留言讨论!
本文来自极简博客,作者:热血战士喵,转载请注明原文链接:Spring Boot配置多数据源