最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

switchRegion(切換地區(qū))功能, 客戶端可手動(dòng)切換地區(qū) , 查詢不同的數(shù)據(jù)庫, 后臺(tái)根據(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)文章

  • Ehcache簡介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Ehcache簡介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了Ehcache簡介,使用Spring的AOP進(jìn)行整合,可以靈活的對方法的返回結(jié)果對象進(jìn)行緩存
    2017-07-07
  • Java中Builder模式的實(shí)現(xiàn)詳解

    Java中Builder模式的實(shí)現(xiàn)詳解

    在設(shè)計(jì)模式中對Builder模式的定義是用于構(gòu)建復(fù)雜對象的一種模式,所構(gòu)建的對象往往需要多步初始化或賦值才能完成。下面這篇文章主要給大家介紹了在Java各個(gè)版本中Builder模式實(shí)現(xiàn)的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考學(xué)習(xí)。
    2017-05-05
  • 詳解Java程序并發(fā)的Wait-Notify機(jī)制

    詳解Java程序并發(fā)的Wait-Notify機(jī)制

    這篇文章主要介紹了詳解Java程序并發(fā)的Wait-Notify機(jī)制,多線程并發(fā)是Java編程中的重要部分,需要的朋友可以參考下
    2015-07-07
  • Java并發(fā)Futures和Callables類實(shí)例詳解

    Java并發(fā)Futures和Callables類實(shí)例詳解

    Callable對象返回Future對象,該對象提供監(jiān)視線程執(zhí)行的任務(wù)進(jìn)度的方法, Future對象可用于檢查Callable的狀態(tài),然后線程完成后從Callable中檢索結(jié)果,這篇文章給大家介紹Java并發(fā)Futures和Callables類的相關(guān)知識,感興趣的朋友一起看看吧
    2024-05-05
  • Mac下eclipse項(xiàng)目根目錄沒有.setting文件夾的解決方案

    Mac下eclipse項(xiàng)目根目錄沒有.setting文件夾的解決方案

    文章介紹了如何通過修改項(xiàng)目根路徑下.setting文件夾中的org.eclipse.wst.common.project.facet.core.xml文件來解決Web版本問題
    2026-02-02
  • Java之理解Redis回收算法LRU案例講解

    Java之理解Redis回收算法LRU案例講解

    這篇文章主要介紹了Java之理解Redis回收算法LRU案例講解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 基于resty orm的ActiveRecord操作數(shù)據(jù)指南

    基于resty orm的ActiveRecord操作數(shù)據(jù)指南

    這篇文章主要為大家介紹了基于resty orm的ActiveRecord操作數(shù)據(jù)指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • Java實(shí)現(xiàn)單鏈表反轉(zhuǎn)的多種方法總結(jié)

    Java實(shí)現(xiàn)單鏈表反轉(zhuǎn)的多種方法總結(jié)

    這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)單鏈表反轉(zhuǎn)的多種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java中shiro框架和security框架的區(qū)別

    Java中shiro框架和security框架的區(qū)別

    這篇文章主要介紹了Java中shiro框架和security框架的區(qū)別,shiro和security作為兩款流行的功能強(qiáng)大的且易于使用的java安全認(rèn)證框架,在近些年中的項(xiàng)目開發(fā)過程中使用廣泛,今天我們就來一起了解一下兩者的區(qū)別
    2023-08-08
  • Spring Data JPA的Audit功能審計(jì)數(shù)據(jù)庫的變更

    Spring Data JPA的Audit功能審計(jì)數(shù)據(jù)庫的變更

    數(shù)據(jù)庫審計(jì)是指當(dāng)數(shù)據(jù)庫有記錄變更時(shí),可以記錄數(shù)據(jù)庫的變更時(shí)間和變更人等,這樣以后出問題回溯問責(zé)也比較方便,本文討論Spring Data JPA審計(jì)數(shù)據(jù)庫變更問題,感興趣的朋友一起看看吧
    2021-06-06

最新評論

南汇区| 武义县| 化德县| 西乌| 枝江市| 九龙城区| 珠海市| 湾仔区| 兴化市| 玉山县| 阆中市| 大理市| 苗栗市| 汶上县| 商城县| 罗城| 花垣县| 江门市| 新巴尔虎右旗| 武安市| 台湾省| 怀化市| 黄浦区| 南通市| 商南县| 兰坪| 平邑县| 资讯 | 高邑县| 兖州市| 民权县| 尉氏县| 土默特左旗| 旌德县| 南安市| 怀柔区| 台东市| 从化市| 江华| 安国市| 乌鲁木齐县|