为了账号安全,请及时绑定邮箱和手机立即绑定

带有 spring-boot 的线程安全 AbstractRoutingDataSource

带有 spring-boot 的线程安全 AbstractRoutingDataSource

天涯尽头无女友 2021-09-03 17:02:21
如何在多个线程上使用多数据库连接..我知道如何动态地使用带有routingdataSource的数据库连接,但我认为它不是线程安全的,因为类是静态的。!!!// first threadContextHolder.set("firstId");mapper.select();ContextHolder.clear(idFirst); // second threadContextHolder.set("secondId");mapper.select();ContextHolder.clear(idFirst);public class ContextHolder {  private static ThreadLocal<String> CONTEXT = new ThreadLocal<>();  public static void set(String dbType) {      CONTEXT.set(dbType);  }  public static String getClientDatabase() {      return CONTEXT.get();  }  public static void clear() {      CONTEXT.remove();  }}喜欢这个代码。    public class Poller implements Runnable {        @Override        public List<Map<String, Object>> getNext() {            Map<String, Object> params = new HashMap<>();            ContextHolder.set(dbConnectionId);            List<Map<String, Object>> list = blogMapper.findAll(params)            ContextHolder.clear();            return list;        }    ....    }
查看完整描述

1 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

 private static ThreadLocal<String> CONTEXT = new ThreadLocal<>();

创建一个线程局部变量。这意味着您放入的内容绑定到特定线程,当您获得某些内容时,返回的是该线程中的内容。

例如,在线程 1 中您设置:

CONTEXT.set(1);

在线程 2 中,您设置:

CONTEXT.set(2);

然后用线程打印里面的内容

CONTEXT.get();

它将1为线程 1 和2线程 2打印。

所以现在,如果您使用标准的同步模型,只要您在输入和/或退出请求时不要忘记清除值就可以了。

一旦您使用异步(反应式、执行程序等),它就会失败,因为您的进程的一部分将在另一个线程上运行。


查看完整回答
反对 回复 2021-09-03
  • 1 回答
  • 0 关注
  • 305 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信