Spring Boot 支持多数据源配置,这在需要同时操作多个数据库或者需要将读写分离的应用场景中非常有用。下面我将详细介绍如何在 Spring Boot 应用程序中配置和使用多数据源。
基础概念
- 数据源: 数据源是用于连接数据库的对象,Spring Boot 默认使用 HikariCP 作为数据源。
- JDBC: Java Database Connectivity,用于与数据库交互的标准接口。
- JPA/Hibernate: 用于 ORM 操作的对象关系映射框架。
添加依赖
首先,你需要在 pom.xml
文件中添加相应的依赖。这里我们假设使用 MySQL 数据库,所以需要添加 HikariCP 和 MySQL JDBC 驱动。
<dependencies><!-- Spring Boot Starter Data JPA --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- HikariCP 数据源 --><dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId></dependency><!-- MySQL JDBC 驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency>
</dependencies>
配置多数据源
在 application.properties
或 application.yml
文件中配置两个数据源,比如 primary
和 secondary
。
application.properties 示例:
# 主数据源
spring.datasource.primary.url=jdbc:mysql://localhost:3306/primary_db?useUnicode=true&characterEncoding=utf8
spring.datasource.primary.username=root
spring.datasource.primary.password=secret
spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.primary.hikari.maximum-pool-size=10# 从数据源
spring.datasource.secondary.url=jdbc:mysql://localhost:3306/secondary_db?useUnicode=true&characterEncoding=utf8
spring.datasource.secondary.username=root
spring.datasource.secondary.password=secret
spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.secondary.hikari.maximum-pool-size=5# JPA 配置
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
application.yml 示例:
spring:datasource:primary:url: jdbc:mysql://localhost:3306/primary_db?useUnicode=true&characterEncoding=utf8username: rootpassword: secretdriver-class-name: com.mysql.cj.jdbc.Driverhikari:maximum-pool-size: 10secondary:url: jdbc:mysql://localhost:3306/secondary_db?useUnicode=true&characterEncoding=utf8username: rootpassword: secretdriver-class-name: com.mysql.cj.jdbc.Driverhikari:maximum-pool-size: 5jpa:show-sql: truehibernate:ddl-auto: update
配置 DataSource Bean
在 Spring Boot 中,你可以通过 @Configuration
类来定义 DataSource Bean。下面是一个例子:
@Configuration
public class DataSourceConfig {@Bean(name = "primaryDataSource")@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();}
}
创建 Repository 和 Service
为了使用不同的数据源,你需要为每个数据源创建一个实体类、Repository 和 Service。
实体类 (Entity)
@Entity
@Table(name = "users")
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;// Getters and Setters
}
Repository (使用不同的数据源)
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}@Repository(lookup = "secondaryUserRepository")
public interface SecondaryUserRepository extends JpaRepository<User, Long> {
}
Service
@Service
public class UserService {private final UserRepository userRepository;private final SecondaryUserRepository secondaryUserRepository;public UserService(UserRepository userRepository, @Qualifier("secondaryUserRepository") SecondaryUserRepository secondaryUserRepository) {this.userRepository = userRepository;this.secondaryUserRepository = secondaryUserRepository;}public List<User> findAllPrimaryUsers() {return userRepository.findAll();}public List<User> findAllSecondaryUsers() {return secondaryUserRepository.findAll();}
}
这样就完成了基本的多数据源配置。你可以根据实际需求调整数据源的数量和配置细节。如果你需要在同一个实体上切换数据源,可能还需要配置不同的实体管理器工厂 (EntityManagerFactory
) 和实体管理器 (EntityManager
)。如果你需要进一步的帮助,请告诉我你具体的使用场景,我可以给出更详细的指导。