如何配置多个数据源在SpringBoot项目中?
参考回答
在 Spring Boot 项目中配置多个数据源时,需要以下几个步骤:
- 定义数据源配置类:为每个数据源创建独立的配置类。
- 配置
DataSource:在每个配置类中配置不同的DataSource。 - 创建
JdbcTemplate或EntityManagerFactory:为每个数据源配置相应的JdbcTemplate或EntityManagerFactory。 - 配置事务管理器:为每个数据源配置事务管理器,以保证事务的正确处理。
详细讲解与拓展
1. 添加依赖
首先,确保你的 pom.xml 中已经添加了 Spring Boot 和数据库相关的依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- 选择适合的数据库驱动 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<!-- 其他数据库驱动依赖 -->
</dependencies>
2. 配置数据源
我们将配置两个数据源,primaryDataSource 和 secondaryDataSource,分别用于主数据库和辅助数据库。
主数据源配置类(PrimaryDataSourceConfig)
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
basePackages = "com.example.repository.primary", // 指定主数据源的 Repository 路径
entityManagerFactoryRef = "primaryEntityManagerFactory",
transactionManagerRef = "primaryTransactionManager"
)
public class PrimaryDataSourceConfig {
@Primary // 标记为主数据源
@Bean(name = "primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary") // 从配置文件中加载配置
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Primary
@Bean(name = "primaryEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(
EntityManagerFactoryBuilder builder, @Qualifier("primaryDataSource") DataSource dataSource) {
return builder
.dataSource(dataSource)
.packages("com.example.model.primary") // 指定实体类路径
.persistenceUnit("primary")
.build();
}
@Primary
@Bean(name = "primaryTransactionManager")
public PlatformTransactionManager primaryTransactionManager(
@Qualifier("primaryEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
辅助数据源配置类(SecondaryDataSourceConfig)
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
basePackages = "com.example.repository.secondary", // 指定辅助数据源的 Repository 路径
entityManagerFactoryRef = "secondaryEntityManagerFactory",
transactionManagerRef = "secondaryTransactionManager"
)
public class SecondaryDataSourceConfig {
@Bean(name = "secondaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.secondary") // 从配置文件中加载配置
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "secondaryEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory(
EntityManagerFactoryBuilder builder, @Qualifier("secondaryDataSource") DataSource dataSource) {
return builder
.dataSource(dataSource)
.packages("com.example.model.secondary") // 指定实体类路径
.persistenceUnit("secondary")
.build();
}
@Bean(name = "secondaryTransactionManager")
public PlatformTransactionManager secondaryTransactionManager(
@Qualifier("secondaryEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
3. 配置数据源属性
在 application.properties 或 application.yml 中为每个数据源配置连接信息。
application.properties 示例
# 主数据源配置
spring.datasource.primary.url=jdbc:h2:mem:testdb
spring.datasource.primary.driverClassName=org.h2.Driver
spring.datasource.primary.username=sa
spring.datasource.primary.password=password
spring.datasource.primary.jpa.hibernate.ddl-auto=update
# 辅助数据源配置
spring.datasource.secondary.url=jdbc:mysql://localhost:3306/secondarydb
spring.datasource.secondary.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.secondary.username=root
spring.datasource.secondary.password=root
spring.datasource.secondary.jpa.hibernate.ddl-auto=update
4. 配置 JdbcTemplate(可选)
如果需要使用 JdbcTemplate 进行操作,可以为每个数据源配置不同的 JdbcTemplate。
@Configuration
public class JdbcTemplateConfig {
@Primary
@Bean(name = "primaryJdbcTemplate")
public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
@Bean(name = "secondaryJdbcTemplate")
public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
5. 创建 Repository
为每个数据源创建不同的 Repository,并在 @EnableJpaRepositories 中指定不同的包路径。
@EnableJpaRepositories(
basePackages = "com.example.repository.primary",
entityManagerFactoryRef = "primaryEntityManagerFactory",
transactionManagerRef = "primaryTransactionManager"
)
public interface PrimaryRepository extends JpaRepository<PrimaryEntity, Long> {
}
@EnableJpaRepositories(
basePackages = "com.example.repository.secondary",
entityManagerFactoryRef = "secondaryEntityManagerFactory",
transactionManagerRef = "secondaryTransactionManager"
)
public interface SecondaryRepository extends JpaRepository<SecondaryEntity, Long> {
}
总结
配置多个数据源时,关键是通过为每个数据源创建独立的配置类,并在配置类中为每个数据源配置 DataSource、EntityManagerFactory 和 TransactionManager。在 application.properties 中配置不同的数据源属性,并通过 @EnableJpaRepositories 指定每个数据源对应的 Repository。这样可以实现在同一个 Spring Boot 应用中使用多个数据源,从而支持多数据库操作。