【问题标题】:Multi Tenancy Support with JPA 2 and EJB 3JPA 2 和 EJB 3 的多租户支持
【发布时间】:2012-05-29 19:57:24
【问题描述】:

我正在尝试更改使用 JPA2 和 EJB3 的 Java EE Web 应用程序以支持多租户。

我想在我的应用程序请求开始之前设置当前租户 ID,这样应用程序本身就不必知道它在多租户环境中使用。

我试图不使用供应商特定的功能来允许自己将应用程序部署到本地容器和谷歌 AppEngine。话虽如此,如果我可以从外部使用供应商特定的功能,例如 servlet 过滤器,这将是一个很好的解决方案。

我目前使用 Glassfish 3.1 作为容器,使用 Hibernate 4.0 作为 JPA2 提供程序。

示例代码将不胜感激。

谢谢你, 伊多。

【问题讨论】:

  • “多租户”是什么意思?部署到不同的数据存储?还是将多个租户部署到一个数据存储?显然“多租户”只是(未发布的)JPA2.1 的一个特性
  • @DataNucleus 我认为 Ido 指的是 Hibernate 对多租户的支持,这种支持已经存在了一段时间。 Ido 正确吗?
  • 我的意思是部署一个应用程序和一个数据库供多个不相关的客户使用。每个客户都需要看到应用程序和数据库是否是他自己的。
  • 好的,谢谢您的澄清。只是你提到了 GAE,还有 Hibernate ......因此有两种不同的 types 数据存储。显然 DataNucleus JPA(GAE JPA 使用的)也提供多租户支持(对于 BigTable 以及所有其他支持的数据存储)
  • 是的,是两种不同的数据访问方式。看起来 EclipseLink 和 Hibernate 都实现了多租户支持,但 JPA 标准被抛在了后面。在标准更新之前,我将不得不使用 vedor 特定的解决方案。 J2EE 7 也许...谢谢。

标签: java hibernate jakarta-ee jpa glassfish


【解决方案1】:

JPA 没有定义任何特定的多租户支持。因此,如果不使用提供者特定的功能,可能很难实现。

您可以为每个租户使用相同的表,但使用不同的架构。然后,您可以拥有一个具有相同映射的不同持久性单元,但在附加的 orm.xml 文件中设置不同的默认模式。

有关 Glassfish 中通过 EclipseLink 的多租户支持,请参阅,

http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Advanced_JPA_Development/Single-Table_Multi-Tenancy

【讨论】:

  • 谢谢。我已经阅读并理解了分离数据库、分离模式和鉴别器列的 3 种策略。我想使用鉴别器,因为它最具可扩展性。我同意似乎我必须使用提供商特定的方法。因为我使用的是 Hibernate,所以我会尝试让它与它一起工作,只有当我失败时,我才会去 EclipseLink。谢谢。
【解决方案2】:

我会使用两个数据库进行多租户。这样,维护仍然更简单。您可以将指标存储在线程本地并在运行时检查它以确定要使用的连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-02
    • 2012-09-24
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多