首页 > 其他分享 >SpringDataJPA配置多套数据源

SpringDataJPA配置多套数据源

时间:2024-07-05 16:20:01浏览次数:14  
标签:SpringDataJPA repository 数据源 数据库 share springframework import org 多套

场景

在使用Spring Data JPA的服务中, 需要同时连接自己的数据库进行增删改查, 也需要连接一个外部提供的数据库查询数据. 因此需要维护两套数据库配置.

实现思路

首先使用JPA一般都需要domain实体和repository. 规划为:

  • 主数据库的实体都放到统一包domain下, repository放repository
  • 第二套数据库的实体都放到统一包share.domain下, repository放share.repository

然后通过配置两套持久化单元,并分别指定扫描的包,完成两套数据库配置. 然后就可以通过调用repository分别实现对两套数据库的调用了.

主数据库的结构

./example/domain/User.java
./example/repository/UserRepository.java

第二套数据库结构

./example/share/domain/School.java
./example/share/repository/SchoolRepository.java

具体实现

1. 主数据库配置

主数据库配置

import com.zaxxer.hikari.HikariDataSource;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
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.EnableJpaAuditing;
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.EntityManagerFactory;
import javax.sql.DataSource;

@Configuration
@EnableJpaAuditing
@EnableTransactionManagement
// 指定扫描的仓库目录
@EnableJpaRepositories(basePackages = {"example.repository"}, entityManagerFactoryRef = "entityManagerFactory", transactionManagerRef = "transactionManager")
public class DatabaseConfiguration {

    @Bean(name = "primaryDataSourceProperties")
    @ConfigurationProperties("spring.datasource")
    @Primary
    public DataSourceProperties dataSourceProperties() {
        return new DataSourceProperties();
    }

    @Primary
    @Bean(name = "dataSource")
    @ConfigurationProperties("spring.datasource.hikari")
    public HikariDataSource firstDataSource(DataSourceProperties firstDataSourceProperties) {
        return firstDataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
    }

    @Primary
    @Bean(name = "entityManagerFactory")
    public LocalContainerEntityManagerFactoryBean
    entityManagerFactory(
            EntityManagerFactoryBuilder builder,
            DataSource dataSource
    ) {
        return builder
                .dataSource(dataSource)
                // 指定扫描包
                .packages("example.domain")
                .persistenceUnit("primary-domain")
                .build();
    }

    @Primary
    @Bean(name = "transactionManager")
    public PlatformTransactionManager transactionManager(
            EntityManagerFactory
                    entityManagerFactory
    ) {
        return new JpaTransactionManager(entityManagerFactory);
    }

}

第二套数据库配置


import com.zaxxer.hikari.HikariDataSource;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
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 javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;

@Configuration
// 指定包扫描目录
@EnableJpaRepositories(basePackages = {"example.share.repository"}, entityManagerFactoryRef = "shareEntityManagerFactory", transactionManagerRef = "shareTransactionManager")
public class DatabaseShareConfiguration {

    @Bean(name = "shareDataSourceProperties")
    // 指定数据库配置前缀,然后可以通过 share.datasource.url 这种格式去配置第二套数据源配置
    @ConfigurationProperties("share.datasource")
    public DataSourceProperties dataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean(name = "shareDataSource")
    // 指定数据库配置前缀,然后可以通过 share.datasource.hikari.poolName 这种格式去配置第二套数据源配置
    @ConfigurationProperties("share.datasource.hikari")
    public DataSource dataSource(@Qualifier("shareDataSourceProperties") DataSourceProperties dataSourceProperties) {
        return dataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
    }


    @Bean(name = "shareEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean
    shareEntityManagerFactory(
            EntityManagerFactoryBuilder builder,
            @Qualifier("shareDataSource") DataSource dataSource
    ) {
        return
                builder
                        .dataSource(dataSource)
                        // 指定扫描包地址
                        .packages("example.share.domain")
                        .persistenceUnit("share")
                        .build();
    }

    @Bean(name = "shareTransactionManager")
    public PlatformTransactionManager shareTransactionManager(
            @Qualifier("shareEntityManagerFactory") EntityManagerFactory
                    shareEntityManagerFactory
    ) {
        return new JpaTransactionManager(shareEntityManagerFactory);
    }
}

application.yml

# 主数据库配置
spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    username: root
    url: jdbc:mysql://localhost:3306/
    password: 
    hikari:
      poolName: Hikari
      auto-commit: false

# 第二套数据库配置
share:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    url: jdbc:mysql://localhost:3307/
    username: root
    password:
    hikari:
      poolName: Share-Hikari
      auto-commit: false

标签:SpringDataJPA,repository,数据源,数据库,share,springframework,import,org,多套
From: https://www.cnblogs.com/xiaojiluben/p/18286061

相关文章

  • 微服务服务添加数据源、认证授权、日志记录,安全处理
    为了增强SpringBoot后端服务的功能,我们可以添加数据库支持、认证授权、日志记录和安全处理。以下是如何集成这些功能的基本步骤。数据库集成添加依赖:在pom.xml或build.gradle中添加数据库驱动和SpringDataJPA的依赖。配置数据库:在src/main/resources/applicat......
  • 数据源dataSource以及事务tx的xml文件配置方式及代码配置方式
    所需要使用的依赖<dependencies><!--springjdbcSpring持久化层支持jar包--><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>6.0.2</versi......
  • 传统后端SQL数据层替代解决方案: 内置数据源+JdbcTemplate+H2数据库 详解
    内置数据源我们回顾一下druid数据源的配置方式通过type属性指定数据源的类型导入依赖starter就使用了spring的自动装配功能格式二是在引入druid的依赖的基础上进行的一种配置方式Tomcat内部也可以进行数据源的配置轻量级中最快的数据源对象我们切换德鲁伊连接池......
  • SpringBoot内置数据源
    回顾:在我们之前学习在配置文件当中配置对应的数据源的时候,我们设置的数据源其实都是Druid的数据源,并且其配置有两种方式,当然这两种方式都需要我们导入对应的有关德鲁伊的依赖才行一种是直接在开始设置为druid数据源类型的一种是在对应的正常的数据库配置下,设置......
  • 树开下拉列表数据源生成
    改自这位兄台的一段代码https://www.cnblogs.com/xiayang/archive/2010/07/19/1780566.html 1///<summary>2///生成一个树形的表样,3///</summary>4///<paramname="dtNodeSets">菜单记录数据所在的表</param>5///<paramn......
  • 【SpringBoot笔记46】SpringBoot多数据源配置(方式三:基于AOP动态切换需要使用哪个数据
    这篇文章,主要介绍SpringBoot多数据源配置(方式三:基于AOP动态切换需要使用哪个数据源)。目录一、SpringBoot多数据源配置1.1、多数据源介绍1.2、搭建基础工程1.3、创建两个数据库1.4、配置多数据源信息1.5、创建动态数据源对象1.6、创建DsContextHolder缓存类1.7、注入......
  • 异构数据源同步之数据同步 → DataX 使用细节
    开心一刻中午我妈微信给我消息妈:儿子啊,妈电话欠费了,能帮妈充个话费吗我:妈,我知道了,我帮你充当我帮我妈把话费充好,正准备回微信的时候,我妈微信给我发消息了妈:等会儿子,不用充了,刚刚有个二臂帮妈充上了我输入框中的(妈,充好了)是发还是不发?简单使用关于DataX,大家可以去看官网......
  • 如何使用前端表格控件实现多数据源整合?
    前言作为表格产品的典型应用场景之一,几乎所有的行业都会存在类Excel报表开发这样的应用场景,而在这些应用场景中,经常会遇见下面的这些痛点:报表数据往往来自多个不同的数据源,需要报表系统能够同时连接多个数据源,并融合不同的数据格式实际的报表中需要对数据结果进行逻辑......
  • 如何使用前端表格控件实现多数据源整合?
    前言作为表格产品的典型应用场景之一,几乎所有的行业都会存在类Excel报表开发这样的应用场景,而在这些应用场景中,经常会遇见下面的这些痛点:报表数据往往来自多个不同的数据源,需要报表系统能够同时连接多个数据源,并融合不同的数据格式实际的报表中需要对数据结果进行逻辑计算,例......
  • 为 Spring Boot 2.6.2 JdbcTemplate 添加新数据源
    我有一个现有的SpringBoot2.6.2微服务,我们希望将调用添加到一个新的数据源。该服务将部署到使用Java8的Openliberty23.0.0.10。我创建了一个新的DAO:publicclassiSeriesDatabaseDao{@AutowiredprivateJdbcTemplatejdbcTemplate;publicStr......