feat(datasource): 实现数据源切换的线程安全和稳定性

- 重构 DynamicDataSourceContextHolder 类,使用 Stack 结构管理数据源类型
- 优化代码结构,提高可读性和可维护性
This commit is contained in:
dftre 2024-10-20 08:59:28 +08:00
parent 3a6b3c9cad
commit 73281b8a7f

View File

@ -1,5 +1,8 @@
package com.ruoyi.framework.datasource;
import java.util.Objects;
import java.util.Stack;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -8,38 +11,50 @@ import org.slf4j.LoggerFactory;
*
* @author ruoyi
*/
public class DynamicDataSourceContextHolder
{
public class DynamicDataSourceContextHolder {
public static final Logger log = LoggerFactory.getLogger(DynamicDataSourceContextHolder.class);
/**
* 使用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);
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()
{
return CONTEXT_HOLDER.get();
public static String getDataSourceType() {
Stack<String> stack = CONTEXT_HOLDER.get();
if (Objects.isNull(stack)) {
return null;
} else {
return stack.peek();
}
}
/**
* 清空数据源变量
*/
public static void clearDataSourceType()
{
CONTEXT_HOLDER.remove();
public static void clearDataSourceType() {
Stack<String> stack = CONTEXT_HOLDER.get();
if (Objects.nonNull(stack) && !stack.isEmpty()) {
stack.pop();
if (stack.isEmpty()) {
CONTEXT_HOLDER.remove();
}
}
}
}