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 三种调用机制(同步、回调、异步) 调用机制的概念 调用机制指的是在进行函数调用时,系统进行操作的方式。针对不同的操作方式,可以分为同步、回调、异步这三种机制。 同步调用机制 同步调用机制指的是在函数调用时,必须等待该函数返回结果之后才能继续执行下一步操作的调用方式。在同步调用过程中,如果该函数阻塞或运行时间较长,那么整个程序的性能就会变得比较低…

    Java 2023年5月26日
    00
  • SpringBoot深入刨析数据层技术

    SpringBoot深入刨析数据层技术 简介 SpringBoot是一个非常流行的Java应用开发框架,它可以有效地提高开发效率和代码质量。在SpringBoot中,数据层是非常重要的一部分,它涉及到对数据库的操作和数据的管理。本文将深入探讨SpringBoot的数据层技术,并提供两个示例供读者参考。 数据库配置 在SpringBoot中配置数据库非常简单,…

    Java 2023年5月15日
    00
  • 使用jmx exporter采集kafka指标示例详解

    以下是关于使用jmx exporter采集kafka指标的完整攻略: 什么是 JMX Exporter? JMX Exporter 是一个自动化采集系统监控指标并将其解析为 Prometheus 指标格式的工具。它允许用户将 JMX 暴露出来的数据转换成 Prometheus 支持的文本格式。 使用 JMX Exporter 采集 Kafka 指标 以下是使…

    Java 2023年5月20日
    00
  • 简单分析Java的求值策略原理

    首先让我们来简单了解一下Java的求值策略原理。Java的求值策略分为两种,一种是短路求值策略,另一种是全部求值策略。 短路求值策略 短路求值策略是指当Java解释器求一个条件表达式的值时,如果根据前面的部分已经可以确定整个表达式的值,那么后面的部分将不再执行,即跳过后面的部分的求值过程。具体示例如下: a && b 在上述代码中,当a为fa…

    Java 2023年5月26日
    00
  • spring boot项目打包成war在tomcat运行的全步骤

    下面是详细的步骤。 1.创建Spring Boot项目 首先,需要使用Spring Initializr创建一个Spring Boot项目。这里我们以创建一个简单的Spring Boot RESTful应用为例。 可以使用如下命令创建: curl https://start.spring.io/starter.zip -o myproject.zip unz…

    Java 2023年5月19日
    00
  • 微信小程序中weui用法解析

    微信小程序中weui用法解析 什么是weui WeUI 是微信官方推出的一个基于Vue.js和Webpack构建的一套移动端UI组件库,适用于微信内网页开发和微信小程序开发。WeUI拥有丰富的UI组件,涉及常用的表单、列表、卡片、操作反馈等等。使用WeUI可以极大地提高小程序的开发效率和用户体验,帮助开发人员快速地开发出适应微信生态的小程序。 在微信小程序中…

    Java 2023年5月30日
    00
  • IDEA配置maven环境的详细教程(Unable to import maven project报错问题的解决)

    下面是详细讲解“IDEA配置maven环境的详细教程(Unable to import maven project报错问题的解决)”的完整攻略。 一、前置条件 在进行IDEA配置maven环境之前,需要确保以下条件全部满足:- 你已经下载并安装了JDK,并确保其JAVA_HOME环境变量已经设置完成。- 你已经下载并安装了maven软件,并确保其MAVEN_…

    Java 2023年5月20日
    00
  • Java Apache Commons报错“UnhandledException”的原因与解决方法

    “UnhandledException”是Java的ApacheCommons类库中的一个异常,通常由以下原因之一引起: 代码错误:如果代码中存在错误,则可能会出现此异常。例如,可能会使用错误的方法或参数。 系统错误:如果系统中存在错误,则可能会出现此异常。例如,可能会出现内存不足或文件系统错误。 以下是两个实例: 例1 如果代码中存在错误,则可以尝试检查代…

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