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实现的文件上传下载工具类,结合完整实例形式分析了java针对文件上传下载操作的相关实现技巧,并且针对上传文件提供了自动命名功能以避免文件命名重复,需要的朋友可以参考下
    2017-11-11
  • Java面试高频问题之RabbitMQ系列全面解析

    Java面试高频问题之RabbitMQ系列全面解析

    在介绍RabbitMQ之前实现要介绍一下MQ,MQ是什么?MQ全称是Message Queue,可以理解为消息队列的意思,简单来说就是消息以管道的方式进行传递。RabbitMQ是一个实现了AMQP(Advanced Message Queuing Protocol)高级消息队列协议的消息队列服务,用Erlang语言的
    2021-11-11
  • java 中RandomAccess接口源码分析

    java 中RandomAccess接口源码分析

    这篇文章主要介绍了java 中RandomAccess接口源码分析的相关资料,需要的朋友可以参考下
    2017-05-05
  • Mybatis-Plus sum聚合函数及按日期查询并求和的方式详解

    Mybatis-Plus sum聚合函数及按日期查询并求和的方式详解

    这篇文章主要介绍了Mybatis-Plus sum聚合函数及按日期查询并求和,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • SpringBoot 部署到服务器上的方法

    SpringBoot 部署到服务器上的方法

    下面小编就为大家分享一篇SpringBoot 部署到服务器上的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • 详解Java中如何使用JFreeChart生成甘特图

    详解Java中如何使用JFreeChart生成甘特图

    甘特图是一种流行的项目管理工具,用于显示项目的进度和任务分配,在Java开发中,JFreeChart是一个强大的开源图表库,能够生成各种类型的图表,下面我们就来看看如何使用JFreeChart生成甘特图吧
    2025-01-01
  • Java中进程、协程与线程的区别详解

    Java中进程、协程与线程的区别详解

    这篇文章主要介绍了Java中进程,线程,协程的概念、区别以及使用场景的选择,早期的操作系统每个程序就是一个进程,知道一个程序运行完,才能进行下一个进程,就是"单进程时代",一切的程序只能串行发生,需要的朋友可以参考下
    2023-08-08
  • Java接口统一样式返回模板的实现

    Java接口统一样式返回模板的实现

    这篇文章主要介绍了Java接口统一样式返回模板的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • web项目WEB-INF下没有web.xml的解决方法

    web项目WEB-INF下没有web.xml的解决方法

    新手如果在web项目创建后WEB-INF下面没有出现web.xml,怎么办?别慌,没有web.xml文件的原因是因为在创建web项目的时候没有把创建web.xml勾上。这篇文章主要介绍了web项目WEB-INF下没有web.xml的解决方法,需要的朋友可以参考下
    2022-12-12
  • mybatis中使用CASE WHEN关键字报错及解决

    mybatis中使用CASE WHEN关键字报错及解决

    这篇文章主要介绍了mybatis中使用CASE WHEN关键字报错及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12

最新评论