当前位置: 首页 > 知识库问答 >
问题:

spring mvc和jpa中的多租户体系结构

姜学海
2023-03-14

我遇到了企业应用程序架构中的一个严重问题。我当前的应用程序是一个使用spring framework 3.2JPA2.0的web应用程序。现在我需要在当前应用程序中支持多租户。

我的要求是,当用户登录到系统时,应该从相应的数据库中为用户提供数据。简而言之,我需要多个数据库支持,这可能会导致不同的连接字符串。那么我如何动态连接到数据库呢?

我的另一个问题是,租户(应用程序的特定客户端)可以动态注册自己,成功注册后,我需要创建一个包含数据库创建和初始化等内容的环境。对于该租户,成功创建环境后,租户的用户可以访问该应用程序。所以问题是如何动态创建环境,如何动态创建EntityManagerFactory

欢迎任何实现多租户的建议...

共有1个答案

熊嘉茂
2023-03-14

在Web环境中,可以通过创建租户特定的别名来实现多租户,这些别名将在 /etc/hosts文件或Windows\System32\驱动程序\etc\主机中定义,以便将租户特定的主机映射到相同的servlet容器。

完成后,您可以定义一个servlet过滤器,该过滤器将读取当前使用的主机,并将其与另一个映射进行比较,例如在属性文件中定义,并填充一个指示当前租户的HTTP会话参数。

这是你在会议中的租户。

您必须以一个公共数据库和一个特定的“租户数据库”表为目标。此表必须包含数据库名称、密码、端口等所有数据源信息,以建立与目标租户数据库的连接。

此时,您可以构建entityManagerFactory:

  Map<String, String> properties = new HashMap<String, String>();
  properties.put("javax.persistence.jdbc.user", "admin");
  properties.put("javax.persistence.jdbc.password", "admin");
  EntityManagerFactory emf = Persistence.createEntityManagerFactory(
      "jdbc:mysql://localhost:3306/myDB", properties);

你现在只需要考虑从正确的地方获得它。…)

希望有帮助

 类似资料:
  • 目前为止,我们已经让用户页面在多租户风格下工作。为使它工作,我们看起来并没有做太多的变化。但请记住,我们正在对一个原来不是多租户的系统作修改。 让我们在 Roles 表应用类似的原则。 再一次,一个租户的用户在不能查看或修改其他租户的角色,每个租户的用户是相互独立工作的。 我们先在 RoleRow.cs 添加 TenantId 属性: namespace MultiTenancy.Administ

  • 在你重新生成并启动项目后,现在的用户页面是这样的: 是的,再也不能看到 admin 用户,但是有些事不对劲。当你点击 tenant2 时,没有任何响应,却得到一个错误 “Can’t load script data: Lookup.Administration.Tenant”。 该错误与我们在仓储层的最近一次过滤没有关系。它不能加载检索脚本,因为当前用户没有 Tenants 表的权限。但是最后怎么

  • 我负责为我的公司建立一个复杂的系统,经过一些研究,决定卡门达符合我的大部分要求。但是我的一些需求并不常见,在阅读了用户指南后,我意识到有很多方法可以做同样的事情,所以我希望这个问题可以澄清我的想法,也可以作为其他人寻找构建类似东西的基础问题。 首先,我计划在Camunda BPM之上构建一个特定的应用程序。它将使用工作流和BPM,但不一定使用BPM/Camunda提供的所有东西。这意味着我不打算使

  • 我有一个django应用程序有客户端和多个用户链接到这些客户端,我想将系统迁移到分层多租户架构。 分层部分 客户端可以递归地包含其他客户端。例如,客户端A包括客户端B和客户端C。如果用户客户端A登录系统,用户将看到客户端B和客户端C的数据。如果客户端B的用户登录系统,用户将只看到客户端B的数据。 多租户部分 我想将所有客户机的数据存储在单独的模式中。但有些数据与客户机无关,所以我想将这些数据存储在

  • 我有一个JPA应用程序正在运行,现在我想支持多租户。我喜欢使用XML而不是注释。 我有两个orm。从持久性引用的xml。xml。 我喜欢对所有实体使用相同的多租户配置:单个表,鉴别器列是tenantUserId,上下文属性是tenant。用户ID。 根据:https://wiki.eclipse.org/EclipseLink/Examples/JPA/EclipseLink-ORM.XML 是否

  • 为了租户间相互独立,我们需要把 TenantId 字段添加到所有表中。 因此,我们先添加一个租户(Tenants)表。 因为 Northwind 表已经有记录,我们将定义一个 ID 为 1 的主租户,并把所有现有记录的 TenantId 设为该值。 现在是时候写迁移类,实际上有两个迁移类:一个是 Northwind ,另一个是 Default 数据库。 DefaultDB_20160110_092