springboot + springdatajpa 多数据源配置(指定包的方式)

在实际的项目开发中,多数据源是比较常见的。
前几天在项目开发过程中,因项目需要配置多数据源,在网上拜读了许多大佬的文章,最终成功配置。
这里记录下,方便自己,也分享给大家,一起学习进步呀。 **如有不对的地方,希望各位大佬指点指点**。仅供参考。

示例项目包版本

  • 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。配置完成并测试通过后给大家分享的 多数据源配置(指定包的方式) 就到这里了。 对于基于注解的 多数据源配置 这几天整理下,再分享给大家。。。。。

最后给大家附上本次分享的源码:

本文示例源代码

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章