繁体   English   中英

带有弹簧引导的线程安全AbstractRoutingDataSource

[英]thread safety AbstractRoutingDataSource with spring-boot

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

我知道如何动态地将数据库连接与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;
        }

    ....
    }

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

创建一个threadlocal变量。 这意味着您放入的内容绑定到特定线程,并且当您得到某些东西时,它就是该线程中返回的内容。

例如,在线程1中设置:

CONTEXT.set(1);

在线程2中,您设置:

CONTEXT.set(2);

然后线程用

CONTEXT.get();

它会打印1线程1和2线程2。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM