请参考以下内容,这是一篇Spring Boot连接多数据源的攻略。
1. 引言
在一些大型项目中,我们经常需要使用多个数据源,以区分开发环境和生产环境数据、用户数据和管理员数据等等。而在Spring Boot方式下如何连接多个数据源呢?
2. 添加依赖
在开始连接多个数据源之前,我们需要确保需要的依赖已经添加到我们的项目中。
我们需要使用spring-boot-starter-jdbc
和spring-boot-starter-data-jpa
这两个依赖,可以在pom.xml文件中进行相应的添加:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
3. 连接配置文件
Spring Boot的连接配置文件默认在src/main/resources/application.properties
中,我们可以在该文件中设置多个数据源的连接信息。
3.1 单数据源配置示例
首先,我们来看一下单数据源的配置示例:
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=root
spring.datasource.password=test
#JPA Configuration
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.database=default
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
其中,spring.datasource.*
是指配置数据库连接的属性,spring.jpa.*
是指配置与JPA相关的属性。
3.2 多数据源配置示例
接下来,我们来配置多数据源。
在实际开发中,我们经常需要分别连接不同的数据库来存储业务数据和系统数据等等多种数据。此时,我们需要配置多个数据源的连接信息。
# primary DataSource
#database connection properties
primary.datasource.driver-class-name=com.mysql.jdbc.Driver
primary.datasource.url=jdbc:mysql://localhost/primarydb
primary.datasource.username=user
primary.datasource.password=pass
# JPA properties
primary.jpa.show-sql=true
primary.jpa.hibernate.ddl-auto=create-drop
primary.jpa.database-platform=org.hibernate.dialect.MySQLDialect
...
# secondary DataSource
#database connection properties
secondary.datasource.driver-class-name=com.mysql.jdbc.Driver
secondary.datasource.url=jdbc:mysql://localhost/secondarydb
secondary.datasource.username=user
secondary.datasource.password=pass
# JPA properties
secondary.jpa.show-sql=true
secondary.jpa.hibernate.ddl-auto=create-drop
secondary.jpa.database-platform=org.hibernate.dialect.MySQLDialect
...
其中,我们设置了两个数据源,在配置文件中分别为primary.datasource.*
和secondary.datasource.*
。这里只是演示,并没有使用实际的数据库连接信息。在实际使用中,需要将这些配置信息进行相应的更改。
4. 配置多数据源
在配置了多个数据源后,我们需要告诉Spring Boot哪些数据源应该分配给哪个JPA Repository,以及每个Repository使用哪个数据源。
创建配置类来为每个数据源配置属性。
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "primaryEntityManagerFactory",
transactionManagerRef = "primaryTransactionManager",
basePackages = { "com.example.demo.repository.primary" }
)
public class PrimaryConfig {
@Primary
@Bean(name = "primaryDataSource")
@ConfigurationProperties(prefix = "primary.datasource")
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.demo.domain.primary").persistenceUnit("primary")
.build();
}
@Primary
@Bean(name = "primaryTransactionManager")
public PlatformTransactionManager primaryTransactionManager(
@Qualifier("primaryEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "secondaryEntityManagerFactory",
transactionManagerRef = "secondaryTransactionManager",
basePackages = { "com.example.demo.repository.secondary" }
)
public class SecondaryConfig {
@Bean(name = "secondaryDataSource")
@ConfigurationProperties(prefix = "secondary.datasource")
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.demo.domain.secondary").persistenceUnit("secondary")
.build();
}
@Bean(name = "secondaryTransactionManager")
public PlatformTransactionManager secondaryTransactionManager(
@Qualifier("secondaryEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
该配置类包含了两个数据源的配置,对应的EntityManager
,TransactionManager
和repositories也对应了不同的数据源。
其中,LocalContainerEntityManagerFactoryBean
是实现EntityManagerFactory
的实现类,其包含了用于建立EntityManager的各种服务,比如JPA实现供应商、 JPA实现供应商属性、数据源、以及对扫描本地包的配置等等。
现在,我们已经配置好了两个数据源,Spring Boot已经了解了每个Repository应该使用哪个数据源,并且已经配置好了相关的bean,所以只需要使用相应的Repository即可。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring boot 连接多数据源过程详解 - Python技术站