jdk17 SpringBoot JPA集成多数据库的示例详解

 更新时间:2023年08月08日 08:42:44   作者:宁漂打工仔  
这篇文章主要介绍了jdk17 SpringBoot JPA集成多数据库的示例代码,包括配置类、请求拦截器、线程上下文等相关知识,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

switchRegion(切换地区)功能, 客户端可手动切换地区 , 查询不同的数据库, 后台根据地区切换数据库, 请求头添加region的key

配置类

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
/**
 * @author Wang
 */
@Configuration
public class DynamicDataSourceConfig {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.us")
    public DataSource usDataSource() {
        return DataSourceBuilder.create().build();
    }
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.ca")
    public DataSource caDataSource() {
        return DataSourceBuilder.create().build();
    }
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.other")
    public DataSource otherDataSource() {
        return DataSourceBuilder.create().build();
    }
    @Bean
    @Primary
    public DynamicDataSource dataSource(DataSource usDataSource, DataSource caDataSource, DataSource otherDataSource) {
        Map<Object, Object> targetDataSources = new HashMap<>(3);
        targetDataSources.put(DataSourceEnum.US.toString().toLowerCase(), usDataSource);
        targetDataSources.put(DataSourceEnum.CA.toString().toLowerCase(), caDataSource);
        targetDataSources.put(DataSourceEnum.OTHER.toString().toLowerCase(), otherDataSource);
        DynamicDataSource dynamicDataSource = new DynamicDataSource(usDataSource, targetDataSources);
        dynamicDataSource.afterPropertiesSet();
        return dynamicDataSource;
    }
}
import com.woodare.cdw.component.context.RequestContextHolder;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import javax.sql.DataSource;
import java.util.Map;
/**
 * @author Wang
 */
public class DynamicDataSource extends AbstractRoutingDataSource {
    public DynamicDataSource(DataSource firstDataSource, Map<Object, Object> targetDataSources) {
        setDefaultTargetDataSource(firstDataSource);
        setTargetDataSources(targetDataSources);
        afterPropertiesSet();
    }
    @Override
    protected Object determineCurrentLookupKey() {
        return RequestContextHolder.getRegion();
    }
}
public enum DataSourceEnum {
    /**
     * region
     */
    US,
    CA,
    OTHER;
}

请求拦截器

import com.woodare.cdw.component.context.RequestContextHolder;
import com.woodare.cdw.core.HeaderCons;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
/**
 * @author Wang
 */
public class RequestInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        String region = request.getHeader(HeaderCons.X_REGION);
        if (region != null) {
            RequestContextHolder.setRegion(region);
        }
        return true;
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        RequestContextHolder.clearRegion();
    }
}
import com.woodare.cdw.interceptor.RequestInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
 * @author Wang
 */
@Configuration
public class ResourceConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new RequestInterceptor());
    }
}

线程上下文

/**
 * @author Wang
 */
public class RequestContextHolder {
    private RequestContextHolder(){}
    private static final ThreadLocal<String> REQUEST_HOLDER = new ThreadLocal<>();
    public static String getRegion() {
        return REQUEST_HOLDER.get();
    }
    public static void setRegion(String region) {
        REQUEST_HOLDER.set(region);
    }
    public static void clearRegion() {
        REQUEST_HOLDER.remove();
    }
}

application 配置

#jpa
spring.jpa.hibernate.ddl-auto=update
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.show-sql=true
# PostgreSQL
spring.datasource.us.jdbc-url=jdbc:postgresql://127.0.0.1:5432/cdw_us
spring.datasource.us.pool-name=cdw_us
spring.datasource.us.username=postgres
spring.datasource.us.password=123
spring.datasource.us.driver-class-name=org.postgresql.Driver
spring.datasource.ca.jdbc-url=jdbc:postgresql://127.0.0.1:5432/cdw_ca
spring.datasource.ca.pool-name=cdw_ca
spring.datasource.ca.username=postgres
spring.datasource.ca.password=123
spring.datasource.ca.driver-class-name=org.postgresql.Driver
spring.datasource.other.jdbc-url=jdbc:postgresql://127.0.0.1:5432/cdw_other
spring.datasource.other.pool-name=cdw_other
spring.datasource.other.username=postgres
spring.datasource.other.password=123
spring.datasource.other.driver-class-name=org.postgresql.Driver

到此这篇关于jdk17 SpringBoot JPA集成多数据库的文章就介绍到这了,更多相关jdk17 SpringBoot JPA集成多数据库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java设计模式之中介者模式

    Java设计模式之中介者模式

    这篇文章介绍了Java设计模式之中介者模式,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • 通过Java读取xml文件内容过程解析

    通过Java读取xml文件内容过程解析

    这篇文章主要介绍了通过Java读取xml文件内容过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • spring boot异步(Async)任务调度实现方法

    spring boot异步(Async)任务调度实现方法

    在没有使用spring boot之前,我们的做法是在配置文件中定义一个任务池,然后将@Async注解的任务丢到任务池中去执行,那么在spring boot中,怎么来实现异步任务的调用了,下面通过本文给大家讲解,需要的朋友参考下
    2018-02-02
  • 详解如何在SpringBoot项目中使用统一返回结果

    详解如何在SpringBoot项目中使用统一返回结果

    在一个完整的项目中,如果每一个控制器的方法都返回不同的结果,那么对项目的维护和扩展都会很麻烦。因此,本文为大家准备了SpringBoot项目中使用统一返回结果的方法,需要的可以参考一下
    2022-10-10
  • java图片格式转换的三段代码

    java图片格式转换的三段代码

    这篇文章主要分享了java图片格式转换的三段代码,小编查找资料整理了java图片格式转换的三段不同代码,推荐给大家。
    2015-11-11
  • IDEA2022创建SpringBoot项目的图文教程

    IDEA2022创建SpringBoot项目的图文教程

    本文主要介绍了IDEA2022创建SpringBoot项目的图文教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • 如何基于java实现解压ZIP TAR等文件

    如何基于java实现解压ZIP TAR等文件

    这篇文章主要介绍了如何基于java实现解压ZIP TAR等文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • spring中JdbcTemplate操作oracle的存储过程实例代码

    spring中JdbcTemplate操作oracle的存储过程实例代码

    JdbcTemplate是Spring对JDBC的封装,目的是使JDBC更加易于使用,JdbcTemplate是Spring的一部分,下面这篇文章主要给大家介绍了关于spring中JdbcTemplate操作oracle的存储过程的相关资料,需要的朋友可以参考下
    2023-04-04
  • Java中生成唯一ID的方法示例

    Java中生成唯一ID的方法示例

    这篇文章主要介绍了Java中生成唯一ID的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • Java详细介绍单例模式的应用

    Java详细介绍单例模式的应用

    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式
    2022-09-09

最新评论