为什么取消了DynamicDataSource/ThreadLocal切换数据源的方式

最后更新:2024-01-19 13:54:42 | 状态:未完成
关于切换数据源常用的方式是:通过ThreadLocal干预DynamicDataSource返回值来实现。
理论是上可以的
  1. 但在JDK8实际应用中发现ThreadLocal方式并不可靠,特别是在线程池或线程共享环境中会导致数据源错乱。
  2. 在切换数据源时需要保持事务状态,干预DynamicDataSource的方式会丢事务状态
  3. 多个数据源要同时操作,如从A数据源中流式读取,过程中插入B数据源



大家经常百度的 为什么数据源切换失败,如果是偶尔失败 就有可能是这个原因造成的
所以在2023-03-01(8.7.x)之后的版本中不再采用这种方式。
而是通过ServiceProxy.service("数据源key")切换service来间接切换数据源
每个数据源都会对应一组service、dao、jdbc、事务管理器、连接池,由一个DataRuntime来维护几者之间的关系。


如果项目中确实需要这种方式切换的话,可以在项目中设置一个ThreadLocal全局变量,在获取service时根据这个变更返回

最近更新 搜索 提交