jdk17?SpringBoot?JPA集成多數(shù)據(jù)庫(kù)的示例詳解
switchRegion(切換地區(qū))功能, 客戶端可手動(dòng)切換地區(qū) , 查詢不同的數(shù)據(jù)庫(kù), 后臺(tái)根據(jù)地區(qū)切換數(shù)據(jù)庫(kù), 請(qǐng)求頭添加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;
}請(qǐng)求攔截器
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
到此這篇關(guān)于jdk17 SpringBoot JPA集成多數(shù)據(jù)庫(kù)的文章就介紹到這了,更多相關(guān)jdk17 SpringBoot JPA集成多數(shù)據(jù)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)的文件上傳下載工具類完整實(shí)例【上傳文件自動(dòng)命名】
這篇文章主要介紹了Java實(shí)現(xiàn)的文件上傳下載工具類,結(jié)合完整實(shí)例形式分析了java針對(duì)文件上傳下載操作的相關(guān)實(shí)現(xiàn)技巧,并且針對(duì)上傳文件提供了自動(dòng)命名功能以避免文件命名重復(fù),需要的朋友可以參考下2017-11-11
Java面試高頻問(wèn)題之RabbitMQ系列全面解析
在介紹RabbitMQ之前實(shí)現(xiàn)要介紹一下MQ,MQ是什么?MQ全稱是Message Queue,可以理解為消息隊(duì)列的意思,簡(jiǎn)單來(lái)說(shuō)就是消息以管道的方式進(jìn)行傳遞。RabbitMQ是一個(gè)實(shí)現(xiàn)了AMQP(Advanced Message Queuing Protocol)高級(jí)消息隊(duì)列協(xié)議的消息隊(duì)列服務(wù),用Erlang語(yǔ)言的2021-11-11
Mybatis-Plus?sum聚合函數(shù)及按日期查詢并求和的方式詳解
這篇文章主要介紹了Mybatis-Plus sum聚合函數(shù)及按日期查詢并求和,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
Java中進(jìn)程、協(xié)程與線程的區(qū)別詳解
這篇文章主要介紹了Java中進(jìn)程,線程,協(xié)程的概念、區(qū)別以及使用場(chǎng)景的選擇,早期的操作系統(tǒng)每個(gè)程序就是一個(gè)進(jìn)程,知道一個(gè)程序運(yùn)行完,才能進(jìn)行下一個(gè)進(jìn)程,就是"單進(jìn)程時(shí)代",一切的程序只能串行發(fā)生,需要的朋友可以參考下2023-08-08
Java接口統(tǒng)一樣式返回模板的實(shí)現(xiàn)
這篇文章主要介紹了Java接口統(tǒng)一樣式返回模板的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
web項(xiàng)目WEB-INF下沒(méi)有web.xml的解決方法
新手如果在web項(xiàng)目創(chuàng)建后WEB-INF下面沒(méi)有出現(xiàn)web.xml,怎么辦?別慌,沒(méi)有web.xml文件的原因是因?yàn)樵趧?chuàng)建web項(xiàng)目的時(shí)候沒(méi)有把創(chuàng)建web.xml勾上。這篇文章主要介紹了web項(xiàng)目WEB-INF下沒(méi)有web.xml的解決方法,需要的朋友可以參考下2022-12-12
mybatis中使用CASE?WHEN關(guān)鍵字報(bào)錯(cuò)及解決
這篇文章主要介紹了mybatis中使用CASE?WHEN關(guān)鍵字報(bào)錯(cuò)及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12

