如何在多个线程上使用多个数据库连接..
我知道如何动态地使用与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
。
所以现在,如果您使用标准同步模型,只要您在输入和/或退出请求时不忘记清除该值就可以了。
一旦你使用async(reactive,executor,...),它就会失败,因为你的进程的一部分将在另一个线程上运行。