如何在多个线程上使用多个数据库连接。
我知道如何动态地将数据库连接与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;
}
....
}
答案 0 :(得分:0)
的
private static ThreadLocal<String> CONTEXT = new ThreadLocal<>();
创建一个线程局部变量。这意味着您放入的内容绑定到特定线程,并且当您得到某些东西时,它就是该线程中返回的内容。
例如,在线程1中设置:
CONTEXT.set(1);
在设置的线程2中:
CONTEXT.set(2);
和更高版本的线程使用
打印内部内容CONTEXT.get();
它将为线程1打印1
,为线程2打印2
。
因此,现在,如果您使用标准的同步模型,那么只要您在输入和/或退出请求时不要忘记清除值即可。
一旦您使用异步(反应式,执行器等),它将失败,因为您的进程的一部分将在另一个线程上运行。