具有 spring-boot 的线程安全 AbstractRoutingDataSource
thread safety AbstractRoutingDataSource with spring-boot
如何在多线程上使用多数据库连接..
我知道如何使用 routingdataSource 动态地使用数据库连接
但我认为这不是线程安全的,因为 class 是静态的。!!!
// 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<>();
创建线程局部变量。这意味着你放在里面的东西被绑定到一个特定的线程,当你得到一些东西时,它就是这个线程中返回的东西。
例如,在线程 1 中您设置:
CONTEXT.set(1);
在线程 2 中您设置:
CONTEXT.set(2);
之后线程用
打印里面的内容
CONTEXT.get();
它将为线程 1 打印 1
,为线程 2 打印 2
。
所以现在,如果你使用标准的同步模型,只要你在进入and/or退出请求时不忘记清除值就可以了。
一旦您使用异步(反应式,执行程序,...)它就会失败,因为您的进程的一部分将 运行 在另一个线程上。
如何在多线程上使用多数据库连接..
我知道如何使用 routingdataSource 动态地使用数据库连接 但我认为这不是线程安全的,因为 class 是静态的。!!!
// 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<>();
创建线程局部变量。这意味着你放在里面的东西被绑定到一个特定的线程,当你得到一些东西时,它就是这个线程中返回的东西。
例如,在线程 1 中您设置:
CONTEXT.set(1);
在线程 2 中您设置:
CONTEXT.set(2);
之后线程用
打印里面的内容CONTEXT.get();
它将为线程 1 打印 1
,为线程 2 打印 2
。
所以现在,如果你使用标准的同步模型,只要你在进入and/or退出请求时不忘记清除值就可以了。
一旦您使用异步(反应式,执行程序,...)它就会失败,因为您的进程的一部分将 运行 在另一个线程上。