Spring Boot 多数据源配置教程
项目介绍
本项目旨在展示如何在Spring Boot应用中配置和使用多个数据源。通过本项目,开发者可以学习到如何为不同的数据库配置独立的DataSource
、EntityManagerFactory
和TransactionManager
,从而实现对多个数据库的灵活管理。
项目快速启动
环境准备
- Java 8 或更高版本
- Maven
- 两个数据库实例(例如MySQL和PostgreSQL)
克隆项目
git clone https://github.com/heikehuan/springboot-multiple-dataSources.git
cd springboot-multiple-dataSources
配置数据源
在application.properties
文件中配置两个数据源的连接信息:
spring.datasource.primary.url=jdbc:mysql://localhost:3306/db1
spring.datasource.primary.username=root
spring.datasource.primary.password=root
spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.secondary.url=jdbc:postgresql://localhost:5432/db2
spring.datasource.secondary.username=postgres
spring.datasource.secondary.password=postgres
spring.datasource.secondary.driver-class-name=org.postgresql.Driver
配置数据源Bean
在DataSourceConfig
类中定义两个数据源的Bean:
@Configuration
public class DataSourceConfig {
@Bean(name = "primaryDataSource")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "secondaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
}
配置EntityManagerFactory和TransactionManager
在JpaConfig
类中配置每个数据源的EntityManagerFactory
和TransactionManager
:
@Configuration
@EnableJpaRepositories(
basePackages = "com.example.demo.primary",
entityManagerFactoryRef = "primaryEntityManagerFactory",
transactionManagerRef = "primaryTransactionManager"
)
public class PrimaryConfig {
@Bean(name = "primaryEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(
EntityManagerFactoryBuilder builder, @Qualifier("primaryDataSource") DataSource dataSource) {
return builder
.dataSource(dataSource)
.packages("com.example.demo.primary.entity")
.persistenceUnit("primaryPU")
.build();
}
@Bean(name = "primaryTransactionManager")
public PlatformTransactionManager primaryTransactionManager(
@Qualifier("primaryEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
@Configuration
@EnableJpaRepositories(
basePackages = "com.example.demo.secondary",
entityManagerFactoryRef = "secondaryEntityManagerFactory",
transactionManagerRef = "secondaryTransactionManager"
)
public class SecondaryConfig {
@Bean(name = "secondaryEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory(
EntityManagerFactoryBuilder builder, @Qualifier("secondaryDataSource") DataSource dataSource) {
return builder
.dataSource(dataSource)
.packages("com.example.demo.secondary.entity")
.persistenceUnit("secondaryPU")
.build();
}
@Bean(name = "secondaryTransactionManager")
public PlatformTransactionManager secondaryTransactionManager(
@Qualifier("secondaryEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
启动应用
mvn spring-boot:run
应用案例和最佳实践
应用案例
假设我们有一个电商应用,需要同时连接到MySQL(用于用户数据)和PostgreSQL(用于订单数据)。通过配置多个数据源,我们可以轻松实现这一需求。
最佳实践
- 分离配置:将每个数据源的配置分离到不同的配置类中,便于管理和维护。
- 命名规范
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考