栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springboot基于栈结构实现数据源切换

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springboot基于栈结构实现数据源切换

先说问题

先说下网上有很多文章写很多demo,参考博客:https://blog.csdn.net/zl_momomo/article/details/82851134,下面是核心代码:

  • 首先定义一个ThrealLocal String类型来存储数据源
  • 做一个切面,设置这个数据源,方法执行完,把ThreadLocal给清理掉。
  • spring 从当前ThreadLocal获取数据源

    这个可以满足我们大多数场景,来看一个问题:


思考下C方法会是哪个数据源?
答案是方法c会执行默认数据源,但是问题是我们在调用c方法上明明标记了a数据源,不应该走a数据源么。方法c执行完,ThreadLocal就没有了,其实我们要还能从ThreadLocal中获取到a数据源。

基于这样的场景好像,只存一个string结构就不满足了。

这样就考虑到,既然是切到注解上,只有这个注解的方法执行完了,才能把ThreadLocal的值给删掉,于是就想到了栈结构。

解决问题
public final class DynamicDataSourceContextHolder {

    private static final ThreadLocal> LOOKUP_KEY_HOLDER = new NamedThreadLocal>("dynamic-datasource") {
        @Override
        protected Deque initialValue() {
            return new ArrayDeque<>();
        }
    };

    private DynamicDataSourceContextHolder() {
    }

    
    public static String peek() {
        return LOOKUP_KEY_HOLDER.get().peek();
    }

    
    public static void push(String ds) {
        LOOKUP_KEY_HOLDER.get().push(StringUtils.isEmpty(ds) ? "" : ds);
    }

    
    public static void poll() {
        Deque deque = LOOKUP_KEY_HOLDER.get();
        deque.poll();
        if (deque.isEmpty()) {
            LOOKUP_KEY_HOLDER.remove();
        }
    }

    
    public static void clear() {
        LOOKUP_KEY_HOLDER.remove();
    }
}
  1. 数据源注解拦截器里面调用push、poll方法,控制添加、删除元素。
  2. spring获取动态数据源只需要调用peek方法,不需要弹出。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/684964.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号