我有一个现有的Java EE 6应用程序(在Glassfish v 3.1中部署),并且希望支持多个租户。我目前在我的应用中使用的技术/API是
据我所知,添加 Multi-Tenancy 支持仅影响持久层。我的问题:有人做过吗?转换应用程序的步骤是什么?这会影响持久性以外的其他层吗?
将会有大量的租户,因此,所有数据都将驻留在同一数据库模式中。
最佳答案
持久层
从持久层开始。完成此操作后,向上滚动整个体系结构。
您提议的架构将具有一个标识租户的ID(例如TenantId)。每个表都将具有此ID。在所有查询中,您都必须确保TenantId与登录的用户的TenantId相匹配。
这样做的困难在于这是一个非常手工的过程。
如果您将Hibernate用作JPA提供程序,那么可以使用一些工具来解决此问题。即 Hibernate Filters 。
这些通常用于限制对 Multi-Tenancy 模式的访问(请参阅here和here for some more)
我没有使用过EclipseLink,但它确实也像has good support for Multi-Tenancy。 DiscriminatorColumn看起来与Hibernate Filters非常相似。
服务层
我假设您正在将JAX-RS和JMS用于服务层。如果是这样,那么您还需要考虑如何传递tenantId和authenticate您的租户。您将如何阻止一个租户访问另一个租户的REST服务?对于JMS也是一样。
UI层
您将必须在UI中将您的登录信息连接到为Filter/Discriminator设置TenantId的Bean(Hibernate或Eclipselink)。