profile
viewpoint

Ask questions多租户场景 是通过filter手动设置DynamicDataSourceContextHolder 的.如果在service层开一个新的线程. 子线程再操作数据库就无法切换数据源.

Enviroment

macos

JDK Version(required): jdk1.8

SpringBoot Version(required): 1.5.x

Starter Version(required): 3.0.1

Describe

多租户场景 是通过filter手动设置DynamicDataSourceContextHolder 的.如果在service层开一个新的线程. 子线程再操作数据库就无法切换数据源. 是不是可以使用NamedInheritableThreadLocal 会更好

private static final ThreadLocal<Deque<String>> LOOKUP_KEY_HOLDER = new NamedInheritableThreadLocal("dynamicDs") {
    @Override
    protected Object initialValue() {
      return new ArrayDeque();
    }
  };

Expected Result: 子线程可以继承父线程的数据源标识

Actual Result:
为peek为null

Steps to reproduce

  • Step 1 image

  • Step 2 image

  • Step 3

image

baomidou/dynamic-datasource-spring-boot-starter

Answer questions 0532

@0532 看master 改到过NamedInheritableThreadLocal , 但是又改回了 NamedThreadLocal ,不知道为什么

https://github.com/baomidou/dynamic-datasource-spring-boot-starter/issues/200#issue-620640060

可能是这个issue的问题

useful!

Related questions

DS注解在Mapper上无效 hot 1
dynamicRoutingDataSource hot 1
dynamicRoutingDataSource hot 1
多数据源启动报错 hot 1
source:https://uonfu.com/
Github User Rank List