在實際的項目開發中,多數據源是比較常見的。
前幾天在項目開發過程中,因項目需要配置多數據源,在網上拜讀了許多大佬的文章,最終成功配置。
這裏記錄下,方便自己,也分享給大家,一起學習進步呀。 **如有不對的地方,希望各位大佬指點指點**。僅供參考。
示例項目包版本
- Spring Boot 2.3.0.RELEASE
- Spring Data Jpa 2.3.0.RELEASE
項目結構
開始配置
配置application.yml文件(注:.properties 配置一樣,改爲對應的配置風格即可)
# 端口
server:
port: 9090
spring:
profiles:
# 指定使用 application-dev.yml 文件
active: dev
jpa:
hibernate:
ddl-auto: update
配置application-dev.yml文件(注:.properties 配置一樣,改爲對應的配置風格即可)
spring:
datasource:
# 第一個數據源
primary:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbcUrl: jdbc:mysql://localhost:3306/primary?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2b8
username: root
password: 123456
# 第二數據源
secondary:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbcUrl: jdbc:mysql://localhost:3306/secondary?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2b8
username: root
password: 123456
上述兩個.yml 文件的配置這裏不作贅述,代碼中已添加相應的註解。值得注意的是,在配置application-dev.yml時,爲保持數據源的有效性,指定的數據源必須是你自己的數據源。
配置第一個數據源(主數據源)
package com.hy.multipledatasources.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.persistence.EntityManager;
import javax.sql.DataSource;
import java.util.Objects;
/***
* @description 多數據源配置類。主數據源
* @EnableJpaRepositories: basePackages 指定到自己的repository。
* @author hy
* @date 2020/5/31 13:50
**/
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = {"com.hy.multipledatasources.employee.repository"},
entityManagerFactoryRef = "primaryEntityManagerFactory",
transactionManagerRef = "primaryTransactionManager")
public class MultipleDataSourcesPrimaryConfig {
/**
* 配置數據源 @Primary . 標記爲主數據源
* @return 、
*/
@Bean("primaryDataSource")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource primaryDataSource(){
return DataSourceBuilder.create().build();
}
/**
* 實體管理工廠的bean
* @param builder \
* @return \
*/
@Bean(name = "primaryEntityManagerFactory")
@Primary
public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder) {
return builder
.dataSource(primaryDataSource())
//這個是指向你的domain, entity的路徑。 實體類所在的包
.packages("com.hy.multipledatasources.employee.entity")
.persistenceUnit("primary")
.build();
}
/**
* 配置 實體管理器
* @param builder 、
* @return 、
*/
@Bean(name = "primaryEntityManager")
@Primary
public EntityManager primaryEntityManager(EntityManagerFactoryBuilder builder){
return Objects.requireNonNull(entityManagerFactory(builder).getObject()).createEntityManager();
}
/**
* 配置事務管理
* @param builder 、
* @return 、
*/
@Bean(name = "primaryTransactionManager")
@Primary
public PlatformTransactionManager primaryTransactionManager(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(Objects.requireNonNull(entityManagerFactory(builder).getObject()));
}
}
配置第二個數據源(次 數據源)
package com.hy.multipledatasources.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.persistence.EntityManager;
import javax.sql.DataSource;
import java.util.Objects;
/***
* @description 多數據源配置類. 次數據源
* @EnableJpaRepositories: basePackages 指定到自己的repository。
* @author hy
* @date 2020/5/31 14:10
**/
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = {"com.hy.multipledatasources.user.repository"},
entityManagerFactoryRef = "secondaryEntityManagerFactory",
transactionManagerRef = "secondaryTransactionManager")
public class MultipleDataSourcesSecondaryConfig {
/**
* 配置次 數據源
* @return 、
*/
@Bean("secondaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource secondaryDataSource(){
return DataSourceBuilder.create().build();
}
/**
* 實體管理工廠的bean
* @param builder \
* @return \
*/
@Bean(name = "secondaryEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory(EntityManagerFactoryBuilder builder) {
return builder
.dataSource(secondaryDataSource())
//這個是指向你的domain, entity的路徑
.packages("com.hy.multipledatasources.user.entity")
.persistenceUnit("secondary")
.build();
}
/**
* 配置 實體管理器
* @param builder 、
* @return 、
*/
@Bean(name = "secondaryEntityManager")
public EntityManager secondaryEntityManager(EntityManagerFactoryBuilder builder){
return Objects.requireNonNull(secondaryEntityManagerFactory(builder).getObject()).createEntityManager();
}
/**
* 配置事務管理
* @param builder 、
* @return 、
*/
@Bean(name = "secondaryTransactionManager")
public PlatformTransactionManager secondaryTransactionManager(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(Objects.requireNonNull(secondaryEntityManagerFactory(builder).getObject()));
}
}
對於上述兩個數據源的配置,代碼中已添加相應的註解。
這裏值得注意的是:MultipleDataSourcesPrimaryConfig (主數據源)中使用 @Primary 註解標記爲主數據源。MultipleDataSourcesSecondaryConfig (次數據源) 中不需要添加 @Primary 註解。
兩個數據的配置中,需要在 @EnableJpaRepositories 註解的參數 basePackages 中指定自己的repository。 在 實體管理工廠的bean 中添加自己的 domain、 entity (實體類所在包)。
上述便是 指定包方式 多數據源的。下面展示下測試效果:
1-1、添加用戶:
1-2、查看對應數據庫中對應的用戶表:
OK, 成功插入一條用戶信息。
1-3、查詢用戶信息:
查詢成功。
2-1、新增員工:
2-2、查看對應數據庫中對應的員工表:
2-3、查詢插入的員工信息:
OK。配置完成並測試通過後給大家分享的 多數據源配置(指定包的方式) 就到這裏了。 對於基於註解的 多數據源配置 這幾天整理下,再分享給大家。。。。。
最後給大家附上本次分享的源碼: