我有一个现有的 Java EE 6 应用程序(部署在 Glassfish v 3.1 中),并且希望支持多个租户。我当前在应用程序中使用的技术/API 是
- EJB(包括EJB定时器服务)
- JPA 2.0 (EclipseLink)
- JSF 2.0
- JMS
- JAX-RS
- 我也打算使用 CDI
据我所知,添加多租户支持仅影响持久层。我的问题:以前有人这样做过吗?转换应用程序的步骤是什么?这会影响持久性之外的其他层吗?
将会有大量的租户,因此,所有数据都将驻留在同一个数据库模式中。
持久层
从持久层开始。完成后,向上滚动您的架构。
您建议的架构将有一个标识租户的 ID(例如 TenantId)。每个表都会有这个 ID。在所有查询中,您必须确保 TenantId 与登录用户的 TenantId 匹配。
这样做的困难在于这是一个非常手动的过程。
如果您选择 Hibernate 作为您的 JPA 提供者,那么有一些工具可以帮助您实现这一点;即休眠过滤器 http://docs.jboss.org/hibernate/core/3.3/reference/en/html/filters.html.
这些通常用于限制对多租户架构的访问(请参阅here https://stackoverflow.com/questions/5461455/saas-multi-tenancy-approaches-for-java-based-gwt-spring-hibernate-web-appli and 这里还有更多 http://vowsaas.blogspot.com/2010/09/database-patterns-tenant-view-filter.html)
我没有使用过 EclipseLink,但看起来确实如此对多租户有良好的支持 http://wiki.eclipse.org/EclipseLink/Development/Indigo/Multi-Tenancy以及。 DiscriminatorColumn 看起来与 Hibernate Filters 的概念非常相似。
服务层
我假设您正在使用 JAX-RS 和 JMS 作为服务层。如果是这样,那么您还需要考虑如何传递tenantId,并且认证 http://weblogs.java.net/blog/2008/03/07/authentication-jersey您的租户。您将如何阻止一个租户访问另一个租户的 REST 服务? JMS 也是如此。
UI Layer
您必须将 UI 中的登录连接到为过滤器/鉴别器设置 TenantId 的 Bean(Hibernate 或 Eclipselink)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)