Pre Merge pull request !427 from 尘埃落定/N/A

pull/427/MERGE
尘埃落定 2025-02-27 02:57:20 +00:00 committed by Gitee
commit d8e70a6075
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
1 changed files with 48 additions and 5 deletions

View File

@ -3,6 +3,8 @@ package com.ruoyi.common.config.datasource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Optional;
/**
*
*
@ -16,15 +18,17 @@ public class DynamicDataSourceContextHolder
* 使ThreadLocalThreadLocal使线
* 线线
*/
private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();
private static final ThreadLocal<DataSourceTypeStruct> CONTEXT_HOLDER = new ThreadLocal<>();
/**
*
*/
public static void setDataSourceType(String dsType)
{
log.info("切换到{}数据源", dsType);
CONTEXT_HOLDER.set(dsType);
DataSourceTypeStruct dataSourceTypeStruct = Optional.ofNullable(CONTEXT_HOLDER.get()).orElse(new DataSourceTypeStruct(DataSourceType.MASTER.name()));//最顶层默认为 MASTER 数据源
dataSourceTypeStruct.setDsType(dsType);
log.info("切换到{}数据源,当前:{}", dsType,dataSourceTypeStruct);
CONTEXT_HOLDER.set(dataSourceTypeStruct);
}
/**
@ -32,7 +36,8 @@ public class DynamicDataSourceContextHolder
*/
public static String getDataSourceType()
{
return CONTEXT_HOLDER.get();
DataSourceTypeStruct dataSourceTypeStruct = Optional.ofNullable(CONTEXT_HOLDER.get()).orElse(new DataSourceTypeStruct(DataSourceType.MASTER.name()));//最顶层默认为 MASTER 数据源
return dataSourceTypeStruct.getDsType();
}
/**
@ -40,6 +45,44 @@ public class DynamicDataSourceContextHolder
*/
public static void clearDataSourceType()
{
CONTEXT_HOLDER.remove();
DataSourceTypeStruct dataSourceTypeStruct = Optional.ofNullable(CONTEXT_HOLDER.get()).orElse(new DataSourceTypeStruct(DataSourceType.MASTER.name()));
dataSourceTypeStruct.clearDsType();
log.info("清理一层数据源,当前:{}", dataSourceTypeStruct);
}
/**
*
*/
static class DataSourceTypeStruct{
private final String dsType;
private DataSourceTypeStruct next;
protected DataSourceTypeStruct(String dsType){
this.dsType = dsType;
}
public String getDsType(){//获得最底层DataSourceTypeStruct的dsType
if(null!=next){
return next.getDsType();
}
return dsType;
}
public void setDsType(String dsType){//设置最底层DataSourceTypeStruct的dsType
if(null!=next){
next.setDsType(dsType);
return;
}
next = new DataSourceTypeStruct(dsType);
}
public void clearDsType(){//清理最底层的DataSourceTypeStruct 层级-1
if(null!=next){
if(null==next.next){
next=null;
}else{
next.clearDsType();
}
}
}
@Override
public String toString(){
return dsType+(null==next?"":("->"+next));
}
}
}