繁体   English   中英

在使用 spring 数据存储库之前更改当前模式 - 多租户

[英]Change current schema before using spring data Repository - Multi tenancy

我正在使用一个多租户 Spring Boot Web 应用程序,它从数据库中读取一些数据。

我已经为每个租户模型构建了模式,实现了 MultiTenantConnectionProvider 和 CurrentTenantIdentifierResolver 以根据租户设置连接。 租户使用 ThreadLocal 变量解析,设置在过滤器中(通过扩展 OncePerRequestFilter 构建)。

但是,我需要解决在过滤器中没有获取租户信息的特定情况。 但是,我可以稍后在处理服务中的请求时获取租户信息,但此时实体管理器已设置(似乎由 OpenSessionInViewFilter 查看 spring 源完成)使用默认模式并且我的所有查询都失败了,因为默认架构不包含我需要的数据。

我的问题是,在休眠过滤器已经设置会话之后,如何将实体管理器设置为指向服务级别的租户特定模式? 我可以做任何过滤器(OpenSessionInViewFilter)正在做的事情,如下所示:

   EntityManager entityManager = entityManagerFactory.createEntityManager();
   TransactionSynchronizationManager.bindResource(entityManager, new EntityManagerHolder(entityManager));
   //unbind once I am done using the repositories

但我在想这是否是正确的方法,或者是否还有其他更好、更简单、有记录的方法。

   EntityManager entityManager = entityManagerFactory.createEntityManager();
   TransactionSynchronizationManager.bindResource(entityManager, new 
   EntityManagerHolder(entityManager));

以上对我不起作用。 但是,我找到了一种解决方法 - 通过在不同的线程中运行我的任务(我刚刚创建了一个固定的线程池执行程序并提交了我的任务)并在 ThreadLocal 对象中设置了新租户,我能够实现我想要的。 通过正确的 CurrentTenantIdentifierResolver 和 MultiTenantConnectionProvider 实现,建立了与预期租户模式的连接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM