SpringBoot+Jpa项目配置双数据源的实现

下面是详细讲解“SpringBoot+Jpa项目配置双数据源的实现”的完整攻略。

一、项目结构

在项目结构上,我们需要将不同的数据源分别放在不同的包下,以避免混淆和管理上的困难。

myproject
├── src
│   └── main
│       ├── java
│       │   └── com.example.myproject
│       │       ├── datasource1
│       │       │   ├── Entity1.java
│       │       │   ├── Repository1.java
│       │       │   └── config
│       │       │       └── DataSource1Config.java
│       │       ├── datasource2
│       │       │   ├── Entity2.java
│       │       │   ├── Repository2.java
│       │       │   └── config
│       │       │       └── DataSource2Config.java
│       │       └── MyProjectApplication.java
│       └── resources
│           ├── application.properties
│           ├── application-datasource1.yml
│           └── application-datasource2.yml
└── pom.xml

其中 datasource1datasource2 分别存放不同的数据源的相关实体和配置,MyProjectApplication 是主要的应用入口。

二、添加依赖

我们需要相应的依赖来支持双数据源的配置。在 pom.xml 中添加以下依赖:

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
  </dependency>
  <!-- 需要添加的额外依赖 -->
  <dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>3.4.1</version>
  </dependency>
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
  </dependency>
</dependencies>

这里添加了 MySQL 数据库的依赖和 HikariCP 连接池的依赖。

三、配置数据源及 JPA

通过 SpringBoot 的自动配置,我们可以在 application.propertiesapplication.yml 中配置数据库连接和 JPA 相关信息。同时,因为我们要配置多个数据源,所以我们需要分别编写两个额外的配置文件,分别为 application-datasource1.ymlapplication-datasource2.yml

1. application.properties

以下是 application.properties 文件的示例配置,该文件放在 resources 目录下:

# 主数据源配置
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=123456

# JPA 配置
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update

# 次数据源配置
datasource2.driver-class-name=com.mysql.jdbc.Driver
datasource2.url=jdbc:mysql://localhost:3306/db2?useUnicode=true&characterEncoding=utf-8
datasource2.username=root
datasource2.password=123456

我们在这里定义了一个主数据源和一个次数据源的相关配置,分别对应了两个不同的数据库。

2. application-datasource1.yml

以下是 application-datasource1.yml 文件的示例配置,该文件也放在 resources 目录下:

spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      jdbc-url: jdbc:mysql://localhost:3306/db1_1?useUnicode=true&characterEncoding=utf-8
      username: root
      password: 123456

jpa:
  properties:
    hibernate:
      dialect: org.hibernate.dialect.MySQL5InnoDBDialect
  hibernate:
    naming:
      physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    ddl-auto: update
  show-sql: true

这里我们使用了 HikariCP 数据源连接池,通过 spring.datasource.type 配置了连接池的类型。同时,我们配置了相关的 JPA 信息。

3. application-datasource2.yml

以下是 application-datasource2.yml 文件的示例配置,同样放在 resources 目录下:

spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      jdbc-url: jdbc:mysql://localhost:3306/db1_2?useUnicode=true&characterEncoding=utf-8
      username: root
      password: 123456

jpa:
  properties:
    hibernate:
      dialect: org.hibernate.dialect.MySQL5InnoDBDialect
  hibernate:
    naming:
      physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    ddl-auto: update
  show-sql: true

该文件与 application-datasource1.yml 类似,只需更改数据库连接信息即可。

四、实现数据源切换

1. 配置类

我们可以创建一个配置类来设置两个数据源的相关信息,同时通过 @Primary 注释标注默认数据源为 datasource1。该类代码如下:

@Configuration
public class DataSourceConfig {

    @Bean(name = "datasource1")
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource1() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "datasource2")
    @ConfigurationProperties(prefix = "datasource2")
    public DataSource dataSource2() {
        return DataSourceBuilder.create().build();
    }

}

这里我们使用 @ConfigurationProperties 注释标注了数据源的前缀,并使用 DataSourceBuilder 创建了对应的数据源。

2. 实现 JPA 配置

在每个数据源的实体和 Repository 中也需要进行一定的配置,以便于正确的使用对应的数据源。我们需要使用 @Qualifier 注释和 @Bean 注释注解当前数据源的 JPA 相关配置。例如:

Entity1.java

@Entity
@Table(name = "entity1")
@Qualifier("entityManagerFactory1")
public class Entity1 {
    // ...
}

Repository1.java

public interface Repository1 extends JpaRepository<Entity1, Long> {
    // ...
}
@Configuration
@EnableJpaRepositories(
    basePackages = "com.example.myproject.datasource1",
    entityManagerFactoryRef = "entityManagerFactory1",
    transactionManagerRef = "transactionManager1"
)
public class DataSource1Config {

    @Bean(name = "entityManagerFactory1")
    @Primary
    public LocalContainerEntityManagerFactoryBean entityManagerFactory1(
            EntityManagerFactoryBuilder builder,
            @Qualifier("datasource1") DataSource dataSource) {
        return builder
                .dataSource(dataSource)
                .packages("com.example.myproject.datasource1") // 数据库中对应实体的包名
                .persistenceUnit("datasource1")
                .build();
    }

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

}

这里在 @EnableJpaRepositories 的参数中指定了当前数据源的所在包名,并使用 @Qualifier 指定了当前数据源的实体管理器。

以及对另一份数据源的配置:

Entity2.java

@Entity
@Table(name = "entity2")
@Qualifier("entityManagerFactory2")
public class Entity2 {
    // ...
}

Repository2.java

public interface Repository2 extends JpaRepository<Entity2, Long> {
    // ...
}
@Configuration
@EnableJpaRepositories(
    basePackages = "com.example.myproject.datasource2",
    entityManagerFactoryRef = "entityManagerFactory2",
    transactionManagerRef = "transactionManager2"
)
public class DataSource2Config {

    @Bean(name = "entityManagerFactory2")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory2(
            EntityManagerFactoryBuilder builder,
            @Qualifier("datasource2") DataSource dataSource) {
        return builder
                .dataSource(dataSource)
                .packages("com.example.myproject.datasource2") // 数据库中对应实体的包名
                .persistenceUnit("datasource2")
                .build();
    }

    @Bean(name = "transactionManager2")
    public PlatformTransactionManager transactionManager2(
            @Qualifier("entityManagerFactory2") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }

}

同样的,在 @EnableJpaRepositories 参数中使用到了 @Qualifier 来指定当前数据源的实体管理器。

五、实现示例

我们这里提供两个简单的示例来演示双数据源的配置和切换。假设我们有两个表 entity1entity2,它们存放在两个不同的数据库中。

示例1

添加一个对应于第一个数据源的 Repository:

@Repository
public interface Entity1Repository extends JpaRepository<Entity1, Long> {
    // ...
}

然后需要在对应的 Service 类上使用 @Qualifier 注释来指定使用的数据源:

@Service
public class Entity1Service {

    private final Entity1Repository entity1Repository;

    @Autowired
    public Entity1Service(@Qualifier("entityManagerFactory1") EntityManager entityManager) {
        this.entity1Repository = 
            new Entity1RepositoryImpl(
                entityManager.getDelegate().unwrap(Session.class)
            );
    }

    // ...
}

Entity1Service 的构造函数中,我们使用了 @Qualifier 注释来指定使用的数据源,通过 EntityManagerSession 来操作对应的数据库。

示例2

该示例为使用第二个数据源的 Repository,同样地需要使用 @Qualifier 注释指定当前使用的数据源。

@Repository
public interface Entity2Repository extends JpaRepository<Entity2, Long> {
    // ...
}
@Service
public class Entity2Service {

    private final Entity2Repository entity2Repository;

    @Autowired
    public Entity2Service(@Qualifier("entityManagerFactory2") EntityManager entityManager) {
        this.entity2Repository = 
            new Entity2RepositoryImpl(
                entityManager.getDelegate().unwrap(Session.class)
            );
    }

    // ...
}

这里我们同样使用了 @Qualifier 注释来指定当前数据源。

六、总结

通过以上的配置,我们实现了 SpringBoot JPA 项目双数据源的配置和使用,并通过示例提供了更加具体的实现方法。双数据源的配置和使用并不复杂,在掌握了基本的配置和使用技巧之后,我们能够在自己的项目中快速的实现双数据源的配置和使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot+Jpa项目配置双数据源的实现 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • java实现的二级联动菜单效果

    下面是详细讲解 “java实现的二级联动菜单效果” 的完整攻略。 1. 确定需求 首先,需要明确二级联动菜单的核心需求,例如:用户选择一级菜单项后,联动显示对应的二级菜单项,用户再选择二级菜单项后,能够得到正确的信息或进行相应操作。 2. 设计数据结构 在了解需求后,需要考虑如何设计数据结构来满足需求。对于二级联动菜单,我们可以考虑使用嵌套的Map或List…

    Java 2023年6月15日
    00
  • 常见的Java并发编程框架有哪些?

    常见的Java并发编程框架有以下几种: Java并发包(java.util.concurrent) Java并发包是Java SE 5之后提供的一组并发编程工具类,它们提供了对线程、锁、原子变量、线程池、阻塞队列等底层机制的封装,方便程序员开发并发程序,避免了手动处理锁、线程等并发编程中的常见问题,例如死锁、内存泄漏等。 使用Java并发包可以通过以下步骤实…

    Java 2023年5月11日
    00
  • SpringMVC数据响应详细介绍

    以下是关于“SpringMVC数据响应详细介绍”的完整攻略,其中包含两个示例。 SpringMVC数据响应详细介绍 在SpringMVC中,我们可以使用多种方式响应数据给客户端。本文将介绍常用的三种方式:ModelAndView、@ResponseBody和HttpServletResponse。 ModelAndView ModelAndView是Spri…

    Java 2023年5月16日
    00
  • 浅析Java的Hibernate框架中的继承关系设计

    浅析Java的Hibernate框架中的继承关系设计 什么是Hibernate? Hibernate是一个Java持久化框架,它可以将Java对象映射到关系数据库中。Hibernate提供了一个对象关系映射(ORM)的实现,通过使用这个框架,Java程序员就可以使用面向对象的方式来处理数据库操作。 继承关系设计在Hibernate中的应用 Hibernate…

    Java 2023年5月20日
    00
  • 剑指Offer之Java算法习题精讲数组查找与字符串交集

    剑指Offer之Java算法习题精讲 – 数组查找与字符串交集 一、本章介绍 本章将会对“剑指Offer”系列书籍中有关数组查找与字符串交集的核心算法习题进行总结和分析。我们将会结合具体的算法样例进行讲解,并且会针对其中涉及到的算法思想与编程技巧进行加深细致的探讨。 二、数组查找 1. 二维数组中的查找 题目描述: 在一个二维数组中,每一行都按照从左到右递增…

    Java 2023年5月19日
    00
  • java实现建造者模式(Builder Pattern)

    下面我就详细讲解一下“Java实现建造者模式(Builder Pattern)”的完整攻略。 什么是建造者模式? 建造者模式是一种对象创建型设计模式,它允许你创建不同风格的对象,同时避免构造器污染问题。在该模式中,我们将构造过程分步进行,使得在创建对象时能够更加灵活地控制每个构造步骤,从而创建不同类型的对象。 建造者模式的角色 建造者模式中有以下几个角色: …

    Java 2023年5月18日
    00
  • Sprint Boot @JsonIgnore使用方法详解

    @JsonIgnore是Spring Boot中的一个注解,用于标记某个字段或方法不参与序列化或反序列化。在本文中,我们将详细介绍@JsonIgnore注解的作用和使用方法,并提供两个示例。 @JsonIgnore注解的作用 @JsonIgnore注解用于标记某个字段或方法不参与序列化或反序列化。当使用@JsonIgnore注解标记某个字段或方法时,该字段或…

    Java 2023年5月5日
    00
  • bootstrap——bootstrapTable实现隐藏列的示例

    当你需要在Bootstrap Table中隐藏列时,可以通过以下步骤实现: 第一步:下载Bootstrap Table 首先,需要从Bootstrap Table官网下载Bootstrap Table插件。 官网链接:https://bootstrap-table.com/ 第二步:编写HTML代码 在编写HTML代码之前,需要加载Bootstrap样式表和…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部