带有 spring-boot 的线程安全 AbstractRoutingDataSource

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


我知道如何动态地使用带有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;

        }


    ....

    }


天涯尽头无女友
浏览 306回答 1
1回答

qq_笑_17

这&nbsp;private&nbsp;static&nbsp;ThreadLocal<String>&nbsp;CONTEXT&nbsp;=&nbsp;new&nbsp;ThreadLocal<>();创建一个线程局部变量。这意味着您放入的内容绑定到特定线程,当您获得某些内容时,返回的是该线程中的内容。例如,在线程 1 中您设置:CONTEXT.set(1);在线程 2 中,您设置:CONTEXT.set(2);然后用线程打印里面的内容CONTEXT.get();它将1为线程 1 和2线程 2打印。所以现在,如果您使用标准的同步模型,只要您在输入和/或退出请求时不要忘记清除值就可以了。一旦您使用异步(反应式、执行程序等),它就会失败,因为您的进程的一部分将在另一个线程上运行。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java