feat(datasource): 实现数据源切换的线程安全和稳定性
- 重构 DynamicDataSourceContextHolder 类,使用 Stack 结构管理数据源类型 - 优化代码结构,提高可读性和可维护性
This commit is contained in:
parent
3a6b3c9cad
commit
73281b8a7f
@ -1,5 +1,8 @@
|
|||||||
package com.ruoyi.framework.datasource;
|
package com.ruoyi.framework.datasource;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Stack;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
@ -8,38 +11,50 @@ import org.slf4j.LoggerFactory;
|
|||||||
*
|
*
|
||||||
* @author ruoyi
|
* @author ruoyi
|
||||||
*/
|
*/
|
||||||
public class DynamicDataSourceContextHolder
|
public class DynamicDataSourceContextHolder {
|
||||||
{
|
|
||||||
public static final Logger log = LoggerFactory.getLogger(DynamicDataSourceContextHolder.class);
|
public static final Logger log = LoggerFactory.getLogger(DynamicDataSourceContextHolder.class);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本,
|
* 使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本,
|
||||||
* 所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
|
* 所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
|
||||||
*/
|
*/
|
||||||
private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();
|
private static final ThreadLocal<Stack<String>> CONTEXT_HOLDER = new ThreadLocal<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置数据源的变量
|
* 设置数据源的变量
|
||||||
*/
|
*/
|
||||||
public static void setDataSourceType(String dsType)
|
public static void setDataSourceType(String dsType) {
|
||||||
{
|
|
||||||
log.info("切换到{}数据源", dsType);
|
log.info("切换到{}数据源", dsType);
|
||||||
CONTEXT_HOLDER.set(dsType);
|
Stack<String> stack = CONTEXT_HOLDER.get();
|
||||||
|
if (Objects.isNull(stack)) {
|
||||||
|
stack = new Stack<>();
|
||||||
|
CONTEXT_HOLDER.set(stack);
|
||||||
|
}
|
||||||
|
stack.push(dsType);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得数据源的变量
|
* 获得数据源的变量
|
||||||
*/
|
*/
|
||||||
public static String getDataSourceType()
|
public static String getDataSourceType() {
|
||||||
{
|
Stack<String> stack = CONTEXT_HOLDER.get();
|
||||||
return CONTEXT_HOLDER.get();
|
if (Objects.isNull(stack)) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
return stack.peek();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 清空数据源变量
|
* 清空数据源变量
|
||||||
*/
|
*/
|
||||||
public static void clearDataSourceType()
|
public static void clearDataSourceType() {
|
||||||
{
|
Stack<String> stack = CONTEXT_HOLDER.get();
|
||||||
|
if (Objects.nonNull(stack) && !stack.isEmpty()) {
|
||||||
|
stack.pop();
|
||||||
|
if (stack.isEmpty()) {
|
||||||
CONTEXT_HOLDER.remove();
|
CONTEXT_HOLDER.remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user