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。配置完成並測試通過後給大家分享的 多數據源配置(指定包的方式) 就到這裏了。 對於基於註解的 多數據源配置 這幾天整理下,再分享給大家。。。。。

最後給大家附上本次分享的源碼:

本文示例源代碼

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