Wechat-Group / WxJava

微信开发 Java SDK ,支持包括微信支付,开放平台,小程序,企业微信,视频号,公众号等的后端开发
Apache License 2.0
29.48k stars 8.5k forks source link

使用 MybatisPlus 多租户插件疑问 #3301

Open qichhhhh opened 1 month ago

qichhhhh commented 1 month ago

现在项目中是根据 APPID 在数据库中查询出 tenant_id,WxMpMessageRouter 的第一个 rule 是

        router.rule()
                .async(false)
                .handler(preMessageHandler)
                .next();

image 将查出的 tenant_id 存入 context 和 TenantHolder 中,MybatisPlus 的多租户插件通过 TenantHolder.get() 取到租户id,并且在后续的查询中拼接 SQL,并且配置了全局拦截器进行 holder.remove()。 遇到的问题是,TenantHolder 中的值可以被同步 handler 取到,但是有一些 handler 是异步的,我在 context 中存入后在异步 handler 中进行同样的 TenantHolder.set(),是不是每个 async handler 都得用 try - finally 包起来并且在 finally 中执行 remove(),以保证 TenantHolder 能被释放?

qichhhhh commented 1 month ago

@binarywang

nadirvishun commented 1 month ago

并且配置了全局拦截器进行 holder.remove()。,如果有配件全局拦截释放的话那就没必要再释放了啊。

qichhhhh commented 1 month ago

并且配置了全局拦截器进行 holder.remove()。,如果有配件全局拦截释放的话那就没必要再释放了啊。

那个 Interceptor 应该只是 remove() 了当前线程的 holder 吧?异步 handler 是在 WxMpMessageRouter.executorService 里执行的,子线程执行完后应该不触发 Interceptor ?

nadirvishun commented 1 month ago

并且配置了全局拦截器进行 holder.remove()。,如果有配件全局拦截释放的话那就没必要再释放了啊。

那个 Interceptor 应该只是 remove() 了当前线程的 holder 吧?异步 handler 是在 WxMpMessageRouter.executorService 里执行的,子线程执行完后应该不触发 Interceptor ?

既然你在子线程赋值了holder,不就是想用这个吗?只要用了不就会触发你的全局拦截器,然后remove掉子线程中的holder,但是比较好奇你的全局拦截器是怎么做的?在哪个过程拦截的,如果执行多个sql的话,会怎么remove?


是不是我理解错了,这个拦截器不是mybatis的拦截器,而是spring的,拦截整个请求完成后remove,如果是这样的话子线程就需要手动来remove了, 无法触发。

qichhhhh commented 1 month ago

并且配置了全局拦截器进行 holder.remove()。,如果有配件全局拦截释放的话那就没必要再释放了啊。

那个 Interceptor 应该只是 remove() 了当前线程的 holder 吧?异步 handler 是在 WxMpMessageRouter.executorService 里执行的,子线程执行完后应该不触发 Interceptor ?

既然你在子线程赋值了holder,不就是想用这个吗?只要用了不就会触发你的全局拦截器,然后remove掉子线程中的holder,但是比较好奇你的全局拦截器是怎么做的?在哪个过程拦截的,如果执行多个sql的话,会怎么remove?

是不是我理解错了,这个拦截器不是mybatis的拦截器,而是spring的,拦截整个请求完成后remove,如果是这样的话子线程就需要手动来remove了, 无法触发。

对的,是Spring的拦截器 ,如果写mybatis的拦截器意思是自定义插件吗?