在`DAO`层,我在`ThreadLocal`上下文中,会存放数据库`Session`。 发现替换为`TransmittableThreadLocal`后,使用`agent`方式。 在多线程场景下,对`session`的操作会影响到主线程,比如说取不到`session`,或者`session`已关闭。 请问支持这种场景吗,还是只能使用值传递,还不能对其进行修改操作?
Activity
oldratlee commentedon Mar 22, 2021
Issue 涉及了下面2个子问题,分开来说明如下:
1. 关于 『传递对象 的有效性维持』
@wuwu20048
DB session
对象) 的生命周期(维持DB session
对象是有效的),会涉及由 2个或多个协作线程的上层业务逻辑。TransmittableThreadLocal
的功能 是 对象的跨线程传递,或说 异步上下文的传递。TransmittableThreadLocal
并不一定能 单方面维持 传递对象是有效的。TransmittableThreadLocal
持有)没有GC
掉就好,这样的对象可以 不需要业务逻辑 而是通过TransmittableThreadLocal
的引用传递 来维持其生命周期。原因是:
TransmittableThreadLocal
没有 维持传递对象有效性的业务逻辑。基于 你提到的『
DB session
对象』的具体场景 说明如下:如果 上层业务没有一些逻辑(如延长
DB
事务/DB session
对象 直到协作的异步线程不再使用)来维持 传递的
DB session
对象是有效性的,那么 在另一个协作线程使用
DB session
对象时,可能会是 已经关闭 或者 取不到了。这个情况/问题 与 是否使用
TransmittableThreadLocal
无关。可以想一下,用手写的逻辑 来 跨线程传递
DB session
对象,也一样有这样的问题。2. 关于『传递对象 是否可修改』
@wuwu20048
TransmittableThreadLocal.copy
方法的重写(overwrite
)来定制 传递对象的拷贝行为,缺省传递的是引用。这个说的在 User Guide 文档中有说明:
@wuwu20048 看看说明清楚了吗?欢迎继续讨论~
[-]异步线程中修改ThreadLocal值,主线程也会被修改?[/-][+]异步线程中修改ThreadLocal值,主线程也会被修改?(DB Session场景)[/+][-]异步线程中修改ThreadLocal值,主线程也会被修改?(DB Session场景)[/-][+]异步线程中修改ThreadLocal值,主线程也会被修改?(DB Session传递场景)[/+]