在现代微服务架构中,许多应用程序需要连接多个数据源。这通常是因为企业的不同模块可能依赖于不同的数据库或可能需要分离读写操作。Spring Boot 提供了灵活的方式来配置多个数据源,下面我们将详细介绍如何实现这一目标。
一、依赖配置
首先,我们需要在 pom.xml
中添加必要的依赖。如果使用 Maven 来管理项目,通常需要 spring-boot-starter-data-jpa
(如果使用 JPA)和数据库驱动(例如 MySQL):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
二、application.yml 配置
在 src/main/resources/application.yml
中配置多个数据源。这里以 MySQL 为例,模拟两个数据源:主数据源和次数据源。
spring:
datasource:
primary:
url: jdbc:mysql://localhost:3306/primary_db
username: root
password: password123
driver-class-name: com.mysql.cj.jdbc.Driver
secondary:
url: jdbc:mysql://localhost:3306/secondary_db
username: root
password: password123
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
primary:
hibernate:
ddl-auto: update
show-sql: true
secondary:
hibernate:
ddl-auto: update
show-sql: true
三、数据源配置
接下来,我们需要为这些数据源创建 DataSource
、EntityManagerFactory
和 TransactionManager
的配置。这里先创建主数据源配置:
@Configuration
@EnableTransactionManagement
public class PrimaryDataSourceConfig {
@Primary
@Bean(name = "primaryDataSource")
@ConfigurationProperties("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.primary.model") // 这里是你的实体类包路径
.persistenceUnit("primary")
.build();
}
@Primary
@Bean(name = "primaryTransactionManager")
public PlatformTransactionManager primaryTransactionManager(
@Qualifier("primaryEntityManagerFactory") EntityManagerFactory primaryEntityManagerFactory) {
return new JpaTransactionManager(primaryEntityManagerFactory);
}
}
然后创建次数据源配置:
@Configuration
@EnableTransactionManagement
public class SecondaryDataSourceConfig {
@Bean(name = "secondaryDataSource")
@ConfigurationProperties("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.secondary.model") // 这里是你的实体类包路径
.persistenceUnit("secondary")
.build();
}
@Bean(name = "secondaryTransactionManager")
public PlatformTransactionManager secondaryTransactionManager(
@Qualifier("secondaryEntityManagerFactory") EntityManagerFactory secondaryEntityManagerFactory) {
return new JpaTransactionManager(secondaryEntityManagerFactory);
}
}
四、使用多数据源
完成数据源的配置后,我们可以通过 JPA Repository 来操作不同的数据源。以下是操作主数据源的示例Repository:
@Repository
public interface PrimaryUserRepository extends JpaRepository<PrimaryUser, Long> {
}
操作次数据源的示例Repository:
@Repository
public interface SecondaryUserRepository extends JpaRepository<SecondaryUser, Long> {
}
五、总结
通过以上步骤,我们成功地配置了 Spring Boot 多数据源。这样,您可以根据需要在同一个应用中轻松地访问不同的数据库。这一机制在微服务架构和复杂的企业应用中尤其有用,使得系统更加灵活和可扩展。
希望这篇文章能对您在 Spring Boot 的多数据源配置方面有所帮助。如有任何问题或更深层次的探讨,欢迎交流!