国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

springboot整合多數(shù)據(jù)源的配置以及動態(tài)切換數(shù)據(jù)源,注解切換數(shù)據(jù)源

這篇具有很好參考價值的文章主要介紹了springboot整合多數(shù)據(jù)源的配置以及動態(tài)切換數(shù)據(jù)源,注解切換數(shù)據(jù)源。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

在許多應(yīng)用程序中,可能需要使用多個數(shù)據(jù)庫或數(shù)據(jù)源來處理不同的業(yè)務(wù)需求。Spring Boot提供了簡便的方式來配置和使用多數(shù)據(jù)源,使開發(fā)人員能夠輕松處理多個數(shù)據(jù)庫連接。如果你的項(xiàng)目中可能需要隨時切換數(shù)據(jù)源的話,那我這篇文章可能能幫助到你

??:這里對于pom文件中坐標(biāo)的引入我就不多贅言了

配置文件

1??:properties文件中

# 數(shù)據(jù)源配置
spring.datasource.mysql.primary.url=jdbc:mysql://127.0.0.1:3351/tally_book?characterEncoding=utf8&serverTimezone=UTC
spring.datasource.mysql.primary.username=root
spring.datasource.mysql.primary.password=123456
spring.datasource.mysql.primary.driver-class-name=com.mysql.cj.jdbc.Driver

# 數(shù)據(jù)源配置
spring.datasource.mysql.slave1.url=jdbc:mysql://127.0.0.1:3351/dingding_mid?characterEncoding=utf8&serverTimezone=UTC
spring.datasource.mysql.slave1.username=root
spring.datasource.mysql.slave1.password=123456
spring.datasource.mysql.slave1.driver-class-name=com.mysql.cj.jdbc.Driver

上面的配置文件中我只寫了兩個源,而且都是mysql 的,primary和slave1就是區(qū)分

2??:配置類實(shí)現(xiàn)多數(shù)據(jù)源配置

package com.todoitbo.tallybookdasmart.config;

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import com.todoitbo.tallybookdasmart.multiDataSource.DataSourceType;
import com.todoitbo.tallybookdasmart.multiDataSource.DynamicDataSource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.*;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

/**
 * @author xiaobo
 * @date 2023/5/19
 */
@Configuration
@Slf4j
public class MultiDataSourceConfig {

    @Bean
    public PlatformTransactionManager platformTransactionManager(DataSource dynamicDataSource) {
        return new DataSourceTransactionManager(dynamicDataSource);
    }

    @Bean
    @Primary
    @DependsOn("primaryDataSource")
    public DataSource dynamicDataSource(@Qualifier(DataSourceType.PRIMARY) DataSource primaryDataSource,
                                        @Qualifier(DataSourceType.SECOND) DataSource secondDataSource) {
        DynamicDataSource dynamicDataSource = new DynamicDataSource();

        // 1.設(shè)置默認(rèn)數(shù)據(jù)源
        dynamicDataSource.setDefaultTargetDataSource(primaryDataSource);
        // 2.配置多數(shù)據(jù)源
        Map<Object, Object> map = new HashMap<>();
        map.put(DataSourceType.PRIMARY, primaryDataSource);
        map.put(DataSourceType.SECOND, secondDataSource);
        // 3.存放數(shù)據(jù)源集
        dynamicDataSource.setTargetDataSources(map);
        return dynamicDataSource;
    }

    @Bean(name = DataSourceType.PRIMARY)
    @ConfigurationProperties(prefix = "spring.datasource.mysql.primary")
    public DataSource primaryDataSource() {
        log.info("主數(shù)據(jù)庫連接池創(chuàng)建中.......");
        return DruidDataSourceBuilder.create().build();
    }

    @Bean(name = DataSourceType.SECOND)
    @ConfigurationProperties(prefix = "spring.datasource.mysql.slave1")
    public DataSource secondDataSource() {
        log.info("second數(shù)據(jù)庫連接池創(chuàng)建中.......");
        return DruidDataSourceBuilder.create().build();
    }

}

3??:自定義注解實(shí)現(xiàn),可使用自定義注解來切換數(shù)據(jù)源

package com.todoitbo.tallybookdasmart.multiDataSource;

import java.lang.annotation.*;

/**
 * description: 自定義注解,標(biāo)記數(shù)據(jù)源
 *
 * @author bo
 * @version 1.0
 * @date 2023/5/19 08:45
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface DataSource {
    String value() default DataSourceType.PRIMARY;
}

4??:定義一個切面類

這段代碼是一個切面類DataSourceAspect,用于在方法調(diào)用前后切換數(shù)據(jù)源。以下是代碼的解釋:

  1. @Aspect:指定該類為切面類,用于定義切面的切入點(diǎn)和增強(qiáng)邏輯。
  2. @Order(value=1):指定切面的執(zhí)行順序,數(shù)值越小優(yōu)先級越高。
  3. @Component:將該切面類聲明為Spring的組件,使其可以被自動掃描并裝配到Spring容器中。
  4. @Pointcut(value = "execution(* com.todoitbo.tallybookdasmart.service.*.*(..)) || execution(* com.todoitbo.tallybookdasmart.*.*(..))"):定義切入點(diǎn)表達(dá)式,指定需要切入的目標(biāo)方法。
  5. @Around("dataSourcePointCut()"):定義環(huán)繞通知,表示在目標(biāo)方法執(zhí)行前后執(zhí)行切面邏輯。
  6. public Object around(ProceedingJoinPoint joinPoint) throws Throwable:環(huán)繞通知方法,包含切面邏輯。
  7. 在方法中通過反射獲取目標(biāo)方法的注解信息,判斷是否存在@DataSource注解,并獲取注解中設(shè)置的數(shù)據(jù)源名稱。
  8. 調(diào)用DataSourceContextHolder.setDataSource(dataSource)方法,將獲取到的數(shù)據(jù)源名稱設(shè)置到當(dāng)前線程的上下文中。
  9. 調(diào)用joinPoint.proceed()方法,繼續(xù)執(zhí)行目標(biāo)方法。
  10. finally塊中調(diào)用DataSourceContextHolder.clearDataSourceType()方法,清除當(dāng)前線程中存儲的數(shù)據(jù)源信息。
package com.todoitbo.tallybookdasmart.multiDataSource;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;


/**
 * @author xiaobo
 */
@Aspect
@Order(value=1)
@Component
@Slf4j
public class DataSourceAspect {

    /** 定義切入點(diǎn)表達(dá)式*/
    @Pointcut(value = "execution(* com.todoitbo.tallybookdasmart.service.*.*(..)) || execution(* com.todoitbo.tallybookdasmart.*.*(..))")
    public void dataSourcePointCut() {
    }
    @Around("dataSourcePointCut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        Object target = joinPoint.getTarget();
        String method = joinPoint.getSignature().getName();
        Class<?> classz = target.getClass();
        Class<?>[] parameterTypes = ((MethodSignature) joinPoint.getSignature()).getMethod().getParameterTypes();
        try {
            // 使用反射獲取目標(biāo)類中指定方法名和參數(shù)類型的方法對象
            Method m = classz.getMethod(method, parameterTypes);
            // 設(shè)置默認(rèn)的數(shù)據(jù)源名稱
            String dataSource = DataSourceType.PRIMARY;
            // 判斷方法是否被@DataSource注解標(biāo)記。
            if (m.isAnnotationPresent(DataSource.class)) {
                // 通過getAnnotation()方法獲取方法上的@DataSource注解對象。
                DataSource ds = m.getAnnotation(DataSource.class);
                // 獲取注解對象中設(shè)置的數(shù)據(jù)源名稱
                dataSource = ds.value();
            }
            // 將獲取到的數(shù)據(jù)源名稱設(shè)置到當(dāng)前線程的上下文中
            DataSourceContextHolder.setDataSource(dataSource);
            // 繼續(xù)執(zhí)行目標(biāo)方法
            return joinPoint.proceed();
        } finally {
            DataSourceContextHolder.clearDataSourceType();
        }
    }

}

5??:存儲和獲取當(dāng)前線程數(shù)據(jù)源的上下文工具類

這段代碼是一個用于存儲和獲取當(dāng)前線程數(shù)據(jù)源的上下文工具類。它使用了Netty的FastThreadLocal來實(shí)現(xiàn)線程本地的快速存取。

  1. 創(chuàng)建FastThreadLocal對象:在類中定義了一個名為CONTEXT_HOLDERFastThreadLocal對象,用于存儲當(dāng)前線程的數(shù)據(jù)源信息。
  2. 設(shè)置數(shù)據(jù)源:setDataSource方法用于將數(shù)據(jù)源名稱設(shè)置到當(dāng)前線程的上下文中。通過調(diào)用CONTEXT_HOLDER.set(dataSource),將數(shù)據(jù)源名稱存儲在當(dāng)前線程中。
  3. 獲取數(shù)據(jù)源:getDataSource方法用于從當(dāng)前線程的上下文中獲取數(shù)據(jù)源名稱。通過調(diào)用CONTEXT_HOLDER.get(),可以獲取當(dāng)前線程的數(shù)據(jù)源名稱。
  4. 清除數(shù)據(jù)源:clearDataSourceType方法用于清除當(dāng)前線程中存儲的數(shù)據(jù)源信息。通過調(diào)用CONTEXT_HOLDER.remove(),可以清除當(dāng)前線程中的數(shù)據(jù)源信息。
package com.todoitbo.tallybookdasmart.multiDataSource;

import io.netty.util.concurrent.FastThreadLocal;

/**
 * description: 存儲和獲取當(dāng)前線程數(shù)據(jù)源的上下文工具類
 *
 * @author bo
 * @version 1.0
 * @date 2023/5/19 08:44
 */
public class DataSourceContextHolder {

    /**
     * 創(chuàng)建FastThreadLocal對象,存儲當(dāng)前線程的數(shù)據(jù)源信息
     */
    private static final FastThreadLocal<String> CONTEXT_HOLDER = new FastThreadLocal<String>();

    /**
     * 設(shè)置數(shù)據(jù)源
     */
    public static void setDataSource(String dataSource) {
        CONTEXT_HOLDER.set(dataSource);
    }

    /**
     * 獲取數(shù)據(jù)源
     */
    public static String getDataSource() {
        return CONTEXT_HOLDER.get();
    }

    /**
     * 清除數(shù)據(jù)源
     */
    public static void clearDataSourceType() {
        CONTEXT_HOLDER.remove();
    }

}

6??:數(shù)據(jù)源類型

package com.todoitbo.tallybookdasmart.multiDataSource;


/**
 * @author xiaobo
 */
public class DataSourceType {
    public static final String PRIMARY = "primaryDataSource";
    public static final String SECOND = "secondDataSource";
}

7??:根據(jù)當(dāng)前線程中的數(shù)據(jù)源上下文獲取對應(yīng)的數(shù)據(jù)源

package com.todoitbo.tallybookdasmart.multiDataSource;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

/**
 * description: 根據(jù)當(dāng)前線程中的數(shù)據(jù)源上下文獲取對應(yīng)的數(shù)據(jù)源。
 *
 * @author bo
 * @version 1.0
 * @date 2023/5/19 08:46
 */
public class DynamicDataSource extends AbstractRoutingDataSource {

    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceContextHolder.getDataSource();
    }

}

具體實(shí)現(xiàn)

在service的實(shí)現(xiàn)類的方法上加入注解即可

package com.todoitbo.tallybookdasmart.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.todoitbo.tallybookdasmart.entity.TbConfig;
import com.todoitbo.tallybookdasmart.mapper.TbConfigMapper;
import com.todoitbo.tallybookdasmart.multiDataSource.DataSource;
import com.todoitbo.tallybookdasmart.multiDataSource.DataSourceType;
import com.todoitbo.tallybookdasmart.service.ITbConfigService;
import com.todoitbo.tallybookdasmart.service.base.BaseServiceImpl;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;


/**
 * (TbConfig)服務(wù)
 *
 * @author bo
 * @since 2023-04-18 21:13:14
 */
@Service
public class TbConfigServiceImpl extends BaseServiceImpl<TbConfigMapper,TbConfig> implements ITbConfigService {

    @Resource
    protected TbConfigMapper mapper;

    @Override
    @DataSource(DataSourceType.SECOND)
    public List<TbConfig> testList() {
        return mapper.selectList(new QueryWrapper<>());
    }
}

效果圖:

springboot多數(shù)據(jù)源配置和切換,springboot,spring boot,java,spring

??:這里只是想展示他確實(shí)是走了從數(shù)據(jù)源了文章來源地址http://www.zghlxwxcb.cn/news/detail-689851.html

到了這里,關(guān)于springboot整合多數(shù)據(jù)源的配置以及動態(tài)切換數(shù)據(jù)源,注解切換數(shù)據(jù)源的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • SpringBoot從數(shù)據(jù)庫讀取數(shù)據(jù)數(shù)據(jù)源配置信息,動態(tài)切換數(shù)據(jù)源

    SpringBoot從數(shù)據(jù)庫讀取數(shù)據(jù)數(shù)據(jù)源配置信息,動態(tài)切換數(shù)據(jù)源

    ? ? ? ? 首先準(zhǔn)備多個數(shù)據(jù)庫,主庫smiling-datasource,其它庫test1、test2、test3 ? ? ? ? 接下來,我們在主庫smiling-datasource中,創(chuàng)建表databasesource,用于存儲多數(shù)據(jù)源相關(guān)信息。表結(jié)構(gòu)設(shè)計(jì)如下 ? ? ? ? 創(chuàng)建好表之后,向表databasesource中存儲test1、test2、test3三個數(shù)據(jù)庫的相關(guān)配置

    2024年01月16日
    瀏覽(36)
  • SpringBoot整合(五)HikariCP、Druid數(shù)據(jù)庫連接池—多數(shù)據(jù)源配置

    SpringBoot整合(五)HikariCP、Druid數(shù)據(jù)庫連接池—多數(shù)據(jù)源配置

    在項(xiàng)目中,數(shù)據(jù)庫連接池基本是必不可少的組件。在目前數(shù)據(jù)庫連接池的選型中,主要是 Druid ,為 監(jiān)控 而生的數(shù)據(jù)庫連接池。 HikariCP ,號稱 性能 最好的數(shù)據(jù)庫連接池。 在Spring Boot 2.X 版本,默認(rèn)采用 HikariCP 連接池。而阿里大規(guī)模采用 Druid 。下面介紹在SpringBoot中使用Hika

    2024年02月17日
    瀏覽(51)
  • SpringBoot整合mysql、postgres、sqlserver實(shí)現(xiàn)多數(shù)據(jù)源配置案例

    SpringBoot整合mysql、postgres、sqlserver實(shí)現(xiàn)多數(shù)據(jù)源配置案例

    ? ? ? ? 分享一下近期處理的一個小demo,關(guān)于配置多數(shù)據(jù)源實(shí)現(xiàn)不同服務(wù)之間的數(shù)據(jù)推送和數(shù)據(jù)治理。第一次接觸到pg庫和sqlserver一頭霧水,選擇了JDBC+mybatis-plus的方式去鏈接。 1、首先要引入以下依賴 2、demo的項(xiàng)目結(jié)構(gòu)如下 3、yml配置文件 4、配置類 5、controller、dao、service以

    2024年02月06日
    瀏覽(28)
  • SpringBoot整合Mybatis-Plus、Druid配置多數(shù)據(jù)源

    SpringBoot整合Mybatis-Plus、Druid配置多數(shù)據(jù)源

    目錄 1.初始化項(xiàng)目 1.1.初始化工程 1.2.添加依賴 1.3.配置yml文件 1.4.Spring Boot 啟動類中添加?@MapperScan?注解,掃描 Mapper 文件夾 1.5.配置使用數(shù)據(jù)源 1.5.1.注解方式 1.5.2.基于AOP手動實(shí)現(xiàn)多數(shù)據(jù)源原生的方式 2.結(jié)果展示 Mybatis-Plus:簡介 | MyBatis-Plus (baomidou.com) 在正式開始之前,先初始

    2024年02月11日
    瀏覽(24)
  • Springboot 配置動態(tài)多數(shù)據(jù)源(Mybatis-plus)

    Springboot 配置動態(tài)多數(shù)據(jù)源(Mybatis-plus)

    前言:在項(xiàng)目中需要用到動態(tài)切換多數(shù)據(jù)源,查閱Mybatis-plus文檔得知可以通過@DS注解,但該方法主要針對不同內(nèi)容的數(shù)據(jù)源,而目前場景是相同內(nèi)容的數(shù)據(jù)庫需要在運(yùn)行時根據(jù)請求頭動態(tài)切換,因此文檔方法不適用。 注意,不要使用dynamic-datasource-spring-boot-starter依賴包。 應(yīng)用

    2024年02月12日
    瀏覽(23)
  • grpc + springboot + mybatis-plus 動態(tài)配置數(shù)據(jù)源

    grpc + springboot + mybatis-plus 動態(tài)配置數(shù)據(jù)源

    前言 這是我在這個網(wǎng)站整理的筆記,關(guān)注我,接下來還會持續(xù)更新。 作者:神的孩子都在歌唱 1.1 項(xiàng)目初始化 項(xiàng)目初始化的時候會調(diào)用com.baomidou.dynamic.datasource.DynamicRoutingDataSource對象的addDataSource方法添加數(shù)據(jù)源,數(shù)據(jù)源存進(jìn)dataSourceMap中。 1.2 接口請求時候 進(jìn)行數(shù)據(jù)操作時,

    2024年02月09日
    瀏覽(30)
  • SpringBoot整合MybatisPlus多數(shù)據(jù)源

    SpringBoot整合MybatisPlus多數(shù)據(jù)源

    相信在很多使用MybatisPlus框架的小伙伴都會遇到多數(shù)據(jù)源的配置問題,并且官網(wǎng)也給出了推薦使用多數(shù)據(jù)源 (dynamic-datasource-spring-boot-starter) 組件來實(shí)現(xiàn)。由于最近項(xiàng)目也在使用這個組件來實(shí)現(xiàn)多數(shù)據(jù)源切換,因此想了解一下該組件是如何運(yùn)行的,經(jīng)過自己的調(diào)試,簡單記錄一

    2024年02月13日
    瀏覽(25)
  • springboot整合kafka多數(shù)據(jù)源

    springboot整合kafka多數(shù)據(jù)源

    在很多與第三方公司對接的時候,或者處在不同的網(wǎng)絡(luò)環(huán)境下,比如在互聯(lián)網(wǎng)和政務(wù)外網(wǎng)的分布部署服務(wù)的時候,我們需要對接多臺kafka來達(dá)到我們的業(yè)務(wù)需求,那么當(dāng)kafka存在多數(shù)據(jù)源的情況,就與單機(jī)的情況有所不同。 單機(jī)的情況 如果是單機(jī)的kafka我們直接通過springboot自

    2024年02月13日
    瀏覽(29)
  • springboot dynamic-datasource 實(shí)現(xiàn)動態(tài)切換數(shù)據(jù)源-多租戶-配置文件切換-基于dynamic-datasource

    1、實(shí)現(xiàn)動態(tài)切換數(shù)據(jù)源 2、實(shí)現(xiàn)配置多數(shù)據(jù)源 3、實(shí)現(xiàn)讀寫分離也可以用多數(shù)據(jù)源方式 4、選擇 dynamic-datasource集成了很多ORM的框架,其中,使用比較多的是druid,但有一些東西開始收費(fèi)了 druid也可以自行配置,配置多了點(diǎn) 目前版本只支持單一位置加載數(shù)據(jù)源(只能從配置文件或

    2024年02月09日
    瀏覽(17)
  • MyBatis整合Springboot多數(shù)據(jù)源實(shí)現(xiàn)

    MyBatis整合Springboot多數(shù)據(jù)源實(shí)現(xiàn)

    數(shù)據(jù)源,實(shí)際就是數(shù)據(jù)庫連接池,負(fù)責(zé)管理數(shù)據(jù)庫連接,在 Springboot 中,數(shù)據(jù)源通常以一個 bean 的形式存在于 IOC 容器中,也就是我們可以通過依賴注入的方式拿到數(shù)據(jù)源,然后再從數(shù)據(jù)源中獲取數(shù)據(jù)庫連接。 那么什么是多數(shù)據(jù)源呢,其實(shí)就是 IOC 容器中有多個數(shù)據(jù)源的 bea

    2023年04月22日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包