欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

jdk17?SpringBoot?JPA集成多數(shù)據(jù)庫的示例詳解

 更新時間:2023年08月08日 08:42:44   作者:寧漂打工仔  
這篇文章主要介紹了jdk17?SpringBoot?JPA集成多數(shù)據(jù)庫的示例代碼,包括配置類、請求攔截器、線程上下文等相關(guān)知識,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

switchRegion(切換地區(qū))功能, 客戶端可手動切換地區(qū) , 查詢不同的數(shù)據(jù)庫, 后臺根據(jù)地區(qū)切換數(shù)據(jù)庫, 請求頭添加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

到此這篇關(guān)于jdk17 SpringBoot JPA集成多數(shù)據(jù)庫的文章就介紹到這了,更多相關(guān)jdk17 SpringBoot JPA集成多數(shù)據(jù)庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實現(xiàn)的文件上傳下載工具類完整實例【上傳文件自動命名】

    Java實現(xiàn)的文件上傳下載工具類完整實例【上傳文件自動命名】

    這篇文章主要介紹了Java實現(xiàn)的文件上傳下載工具類,結(jié)合完整實例形式分析了java針對文件上傳下載操作的相關(guān)實現(xiàn)技巧,并且針對上傳文件提供了自動命名功能以避免文件命名重復(fù),需要的朋友可以參考下
    2017-11-11
  • Java面試高頻問題之RabbitMQ系列全面解析

    Java面試高頻問題之RabbitMQ系列全面解析

    在介紹RabbitMQ之前實現(xiàn)要介紹一下MQ,MQ是什么?MQ全稱是Message Queue,可以理解為消息隊列的意思,簡單來說就是消息以管道的方式進行傳遞。RabbitMQ是一個實現(xiàn)了AMQP(Advanced Message Queuing Protocol)高級消息隊列協(xié)議的消息隊列服務(wù),用Erlang語言的
    2021-11-11
  • java 中RandomAccess接口源碼分析

    java 中RandomAccess接口源碼分析

    這篇文章主要介紹了java 中RandomAccess接口源碼分析的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Mybatis-Plus?sum聚合函數(shù)及按日期查詢并求和的方式詳解

    Mybatis-Plus?sum聚合函數(shù)及按日期查詢并求和的方式詳解

    這篇文章主要介紹了Mybatis-Plus sum聚合函數(shù)及按日期查詢并求和,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • SpringBoot 部署到服務(wù)器上的方法

    SpringBoot 部署到服務(wù)器上的方法

    下面小編就為大家分享一篇SpringBoot 部署到服務(wù)器上的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • 詳解Java中如何使用JFreeChart生成甘特圖

    詳解Java中如何使用JFreeChart生成甘特圖

    甘特圖是一種流行的項目管理工具,用于顯示項目的進度和任務(wù)分配,在Java開發(fā)中,JFreeChart是一個強大的開源圖表庫,能夠生成各種類型的圖表,下面我們就來看看如何使用JFreeChart生成甘特圖吧
    2025-01-01
  • Java中進程、協(xié)程與線程的區(qū)別詳解

    Java中進程、協(xié)程與線程的區(qū)別詳解

    這篇文章主要介紹了Java中進程,線程,協(xié)程的概念、區(qū)別以及使用場景的選擇,早期的操作系統(tǒng)每個程序就是一個進程,知道一個程序運行完,才能進行下一個進程,就是"單進程時代",一切的程序只能串行發(fā)生,需要的朋友可以參考下
    2023-08-08
  • Java接口統(tǒng)一樣式返回模板的實現(xiàn)

    Java接口統(tǒng)一樣式返回模板的實現(xiàn)

    這篇文章主要介紹了Java接口統(tǒng)一樣式返回模板的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • web項目WEB-INF下沒有web.xml的解決方法

    web項目WEB-INF下沒有web.xml的解決方法

    新手如果在web項目創(chuàng)建后WEB-INF下面沒有出現(xiàn)web.xml,怎么辦?別慌,沒有web.xml文件的原因是因為在創(chuàng)建web項目的時候沒有把創(chuàng)建web.xml勾上。這篇文章主要介紹了web項目WEB-INF下沒有web.xml的解決方法,需要的朋友可以參考下
    2022-12-12
  • mybatis中使用CASE?WHEN關(guān)鍵字報錯及解決

    mybatis中使用CASE?WHEN關(guān)鍵字報錯及解決

    這篇文章主要介紹了mybatis中使用CASE?WHEN關(guān)鍵字報錯及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12

最新評論