spring - Spring 中的 Hibernate Multi-Tenancy 和异步执行(通过 @Async、@Scheduled 等)

标签 spring hibernate spring-mvc asynchronous multi-tenant

在使用 @Async 时,我遇到了 spring + hibernate Multi-Tenancy 问题:无法解析当前租户,因为它存储在 ThreadLocal 中,该 ThreadLocal 未继承到线程(由某些 TaskExecutor 提供)。有这方面的经验吗?

提前致谢! 埃尔文

最佳答案

我刚刚看到你的问题。我面临着完全相同的问题,我提出了以下解决方案,这可能不是最好的,但目前它足以完成我的任务。

我在这里采纳了这个想法How to enable request scope in async task executor我稍微修改了它,因为它不能正常工作以满足我的需要。

我所做的是:

  1. 像上面的链接一样创建一个 TenantAwareThreadPoolExecutor;
  2. 创建TenantAwareCallable(它将有一个私有(private)字符串tenantName,而不是RequestAttributes(按照您已经做的方式进行操作))。
  3. 创建一个单例组件,用于存储您从请求中获取的当前租户。
  4. 将您需要在可调用对象的 call() 方法中使用的租户保存并清除到此组件中。
  5. 现在,您必须更改 CurrentTenantIdentifierResolver 以从该单例获取租户(检查请求后,否则其他请求将使用与该请求相同的租户)。

请注意:只有当您以队列方式逐个执行任务时,这才有效。如果您同时执行一些操作,则此方法将不起作用。

任何改进的想法都会被接受。

关于spring - Spring 中的 Hibernate Multi-Tenancy 和异步执行(通过 @Async、@Scheduled 等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40888047/

相关文章:

java - org.springframework.orm.hibernate3.HibernateSystemException : a different object with the same identifier value was already associated with the session

java - 带有 setter 注入(inject)的 Spring @Qualifier 奇怪行为

java - ApachetilesV3 包含在子页面中

java - Spring:对我的 ThreadFactory 使用 "Lookup method injection"看起来不可扩展

hibernate - 使用Grails引导具有多个数据库的数据时没有 hibernate session

spring-mvc - Spring ResponseEntityExceptionHandler 不解析覆盖消息

java - 带有微服务的 Spring REST 应用程序

java - 如何使用hibernate创建新的oracle数据库

java - 如何在删除前检查对象是否被引用

java - Spring MVC RequestMapping 发布方法