当前位置: 首页 > news >正文

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@Primarypublic 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();}@Overrideprotected 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 {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {String region = request.getHeader(HeaderCons.X_REGION);if (region != null) {RequestContextHolder.setRegion(region);}return true;}@Overridepublic 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 {@Overridepublic 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.Driverspring.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.Driverspring.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
http://www.lryc.cn/news/115674.html

相关文章:

  • vue 新学习 06 js的prototype ,export暴露,vue组件,一个重要的内置关系
  • 冠达管理:“高温超导”不是“室温超导”,5天4板百利电气再次澄清
  • CS 144 Lab Four 收尾 -- 网络交互全流程解析
  • Linux面试专题
  • MySQL错误日志(Error Log)详解
  • Qt应用开发(基础篇)——LCD数值类 QLCDNumber
  • 新版百度、百家号旋转验证码识别
  • PMP考试每日一练(8月8日)
  • 机器学习实战1-kNN最近邻算法
  • 【eNSP】静态路由
  • 算法训练Day42|1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零
  • HBase-组成
  • 第一部分:领域中的基本概念
  • react使用ref调用子组件的方法
  • JVM面试突击班2
  • 【80天学习完《深入理解计算机系统》】第二天 2.2 整数的表示【有符号数,无符号数,符号数的扩展,有无符号数的转变】
  • 基于 CentOS 7 构建 LVS-DR 群集以及配置nginx负载均衡
  • golang trace view 视图详解
  • zju代码题:4-6
  • 数据链路层概述
  • Python代码使用技巧汇总:提升你的编程技能
  • Ae 效果:CC Spotlight
  • 如何在页面中嵌入音频和视频?
  • Unity 中检测射线穿过的所有的物体
  • LeetCode 29题:两数相除
  • Axure RP9中使用Echarts示例
  • 利用Jmeter做接口测试全流程分析
  • 超级浏览器与指纹浏览器:功能与特点的比较
  • 云端同步、高效无界:5款免费的跨平台思维导图软件推荐!
  • OpenAI允许网站阻止其网络爬虫;谷歌推出类似Grammarly的语法检查功能