线程安全AbstractRoutingDataSource与spring-boot

问题描述 投票:0回答:1

如何在多个线程上使用多个数据库连接..

我知道如何动态地使用与routingdataSource的数据库连接,但我认为它不是线程安全因为类是静态的。

// first thread

ContextHolder.set("firstId");
mapper.select();
ContextHolder.clear(idFirst);


 // second thread

ContextHolder.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;
        }

    ....
    }
java spring-boot mybatis
1个回答
0
投票

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

创建一个threadlocal变量。这意味着你放在里面的东西绑定到一个特定的线程,当你得到的东西,它是在这个线程中返回的东西。

例如,在线程1中设置:

CONTEXT.set(1);

在线程2中你设置:

CONTEXT.set(2);

然后用一个线程打印内部的内容

CONTEXT.get();

它将为线程1打印1,为线程2打印2

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

一旦你使用async(reactive,executor,...),它就会失败,因为你的进程的一部分将在另一个线程上运行。

© www.soinside.com 2019 - 2024. All rights reserved.