如何在多个线程上使用多数据库连接..我知道如何动态地使用带有routingdataSource的数据库连接,但我认为它不是线程安全的,因为类是静态的。!!!// first threadContextHolder.set("firstId");mapper.select();ContextHolder.clear(idFirst); // second threadContextHolder.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; } .... }
1 回答
qq_笑_17
TA贡献1818条经验 获得超7个赞
这
private static ThreadLocal<String> CONTEXT = new ThreadLocal<>();
创建一个线程局部变量。这意味着您放入的内容绑定到特定线程,当您获得某些内容时,返回的是该线程中的内容。
例如,在线程 1 中您设置:
CONTEXT.set(1);
在线程 2 中,您设置:
CONTEXT.set(2);
然后用线程打印里面的内容
CONTEXT.get();
它将1
为线程 1 和2
线程 2打印。
所以现在,如果您使用标准的同步模型,只要您在输入和/或退出请求时不要忘记清除值就可以了。
一旦您使用异步(反应式、执行程序等),它就会失败,因为您的进程的一部分将在另一个线程上运行。
添加回答
举报
0/150
提交
取消