在实际的项目开发中,多数据源是比较常见的。
前几天在项目开发过程中,因项目需要配置多数据源,在网上拜读了许多大佬的文章,最终成功配置。
这里记录下,方便自己,也分享给大家,一起学习进步呀。 **如有不对的地方,希望各位大佬指点指点**。仅供参考。
示例项目包版本
- 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。配置完成并测试通过后给大家分享的 多数据源配置(指定包的方式) 就到这里了。 对于基于注解的 多数据源配置 这几天整理下,再分享给大家。。。。。
最后给大家附上本次分享的源码: