为什么取消了DynamicDataSource/ThreadLocal切换数据源的方式
最后更新:2024-09-01 05:30:00
|
状态:未完成
关于切换数据源常用的方式是:通过ThreadLocal干预DynamicDataSource返回值来实现。
理论是上可以的
大家经常百度的 为什么数据源切换失败,如果是偶尔失败 就有可能是这个原因造成的
所以在2023-03-01(8.7.x)之后的版本中不再采用这种方式。
而是通过ServiceProxy.service("数据源key")切换service来间接切换数据源
每个数据源都会对应一组service、dao、jdbc、事务管理器、连接池,由一个DataRuntime来维护几者之间的关系。
理论是上可以的
-
但在JDK8实际应用中发现ThreadLocal方式并不可靠,特别是在线程池或线程共享环境中会导致数据源错乱。
- 在切换数据源时需要保持事务状态,干预DynamicDataSource的方式会丢事务状态
- 多个数据源要同时操作,如从A数据源中流式读取,过程中插入B数据源
大家经常百度的 为什么数据源切换失败,如果是偶尔失败 就有可能是这个原因造成的
所以在2023-03-01(8.7.x)之后的版本中不再采用这种方式。
而是通过ServiceProxy.service("数据源key")切换service来间接切换数据源
每个数据源都会对应一组service、dao、jdbc、事务管理器、连接池,由一个DataRuntime来维护几者之间的关系。
如果项目中确实需要这种方式切换的话,可以在项目中设置一个ThreadLocal全局变量,在获取service时根据这个变更返回