在现代微服务架构中,应用通常需要与多个数据库交互。Spring Boot 提供了很好的支持,使我们可以灵活地配置多个数据源。下面将详细介绍如何在 Spring Boot 应用中配置多个数据源。
1. Maven 依赖
首先,确保你的 pom.xml
中添加了相关的数据库驱动依赖。例如,如果你使用 MySQL 数据库,可以添加以下依赖:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
2. 配置多个数据源
在 application.yml
或 application.properties
文件中,你可以定义多个数据源的配置。以下示例展示了如何配置两个数据源,分别是 datasource1
和 datasource2
。
spring:
datasource:
datasource1:
url: jdbc:mysql://localhost:3306/db1
username: user1
password: pass1
driver-class-name: com.mysql.cj.jdbc.Driver
datasource2:
url: jdbc:mysql://localhost:3306/db2
username: user2
password: pass2
driver-class-name: com.mysql.cj.jdbc.Driver
3. 创建配置类
接下来,你需要为每个数据源创建一个配置类,以便让 Spring Boot 知道如何处理这些数据源。下面是一个简单的配置类示例。
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.boot.orm.jpa.JpaProperties;
import org.springframework.boot.orm.jpa.hibernate.SpringJpaVendorAdapter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
@Configuration
@EnableJpaRepositories(
basePackages = "com.example.repository.datasource1", // 第一个数据源的Repository路径
entityManagerFactoryRef = "datasource1EntityManagerFactory",
transactionManagerRef = "datasource1TransactionManager"
)
public class DataSource1Config {
@Bean(name = "datasource1")
@ConfigurationProperties("spring.datasource.datasource1")
public DataSource datasource1() {
return DataSourceBuilder.create().build();
}
@Bean(name = "datasource1EntityManagerFactory")
public LocalContainerEntityManagerFactoryBean datasource1EntityManagerFactory(EntityManagerFactoryBuilder builder) {
return builder
.dataSource(datasource1())
.packages("com.example.model.datasource1") // 第一个数据源对应的实体类路径
.persistenceUnit("datasource1")
.jpaVendorAdapter(new SpringJpaVendorAdapter())
.properties(new JpaProperties().getHibernateProperties(new HibernateJpaAutoConfiguration().entityManagerFactoryBuilder(null).getJpaProperties()))
.build();
}
@Bean(name = "datasource1TransactionManager")
public PlatformTransactionManager datasource1TransactionManager(
@Qualifier("datasource1EntityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
同样的方式创建第二个数据源的配置类 DataSource2Config
,唯一的不同是在包名和数据源名称部分进行相应修改。
4. 使用数据源
最后,在你的 Service 或 Repository 中使用这些数据源。你可以通过 @Qualifier
注解来指定使用哪个数据源。例如:
@Service
public class MyService {
@Autowired
@Qualifier("datasource1")
private DataSource dataSource1;
@Autowired
@Qualifier("datasource2")
private DataSource dataSource2;
// 使用数据源的方法
}
结论
通过上述步骤,你可以在 Spring Boot 中成功地配置多个数据源。这种实现方式可以有效地满足微服务架构的小模块对数据库的多样化需求。需要注意的是,每个数据源的配置需要十分小心,尤其是在实体类、Repository 和 Transaction 的对应关系上,以确保数据的正确性和完整性。通过合理的设计,你的应用将能够充分利用多个数据源,提高系统的灵活性与可扩展性。