我有一个现有的Java EE 6应用程序(在Glassfish v 3.1中部署),并且希望支持多个租户。我目前在我的应用中使用的技术/API是

  • EJB(包括EJB计时器服务)
  • JPA 2.0(EclipseLink)的
  • JSF 2.0
  • JMS
  • JAX-RS
  • 我计划也使用CDI

  • 据我所知,添加 Multi-Tenancy 支持仅影响持久层。我的问题:有人做过吗?转换应用程序的步骤是什么?这会影响持久性以外的其他层吗?

    将会有大量的租户,因此,所有数据都将驻留在同一数据库模式中。

    最佳答案

    持久层
    从持久层开始。完成此操作后,向上滚动整个体系结构。
    您提议的架构将具有一个标识租户的ID(例如TenantId)。每个表都将具有此ID。在所有查询中,您都必须确保TenantId与登录的用户的TenantId相匹配。
    这样做的困难在于这是一个非常手工的过程。
    如果您将Hibernate用作JPA提供程序,那么可以使用一些工具来解决此问题。即 Hibernate Filters
    这些通常用于限制对 Multi-Tenancy 模式的访问(请参阅herehere 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)。

    10-06 07:11