java - spring mvc 与 jpa 中的 Multi-Tenancy 架构

标签 java spring jpa architecture multi-tenant

我的企业应用程序架构中遇到了一个严重的问题。我当前的应用程序是一个使用 spring Framework 3.2+jpa 2.0 的 Web 应用程序。现在我需要在当前应用程序中支持 Multi-Tenancy 。

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

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

非常欢迎任何实现 Multi-Tenancy 的建议......

最佳答案

在 Web 环境中,可以通过创建在/etc/hosts 文件或 Windows\System32\drivers\etc\hosts 中定义的特定于租户的别名来实现 Multi-Tenancy ,以便映射特定于租户的别名托管到同一个 servlet 容器。

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

这里,租户已加入 session 。

您必须定位一个公共(public)数据库和一个特定的“tenant_database”表。该表必须保存数据库名称、密码、端口等所有数据源信息,以建立与目标租户数据库的连接。

此时您可以构建一个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);

你现在只需要考虑从正确的地方获取它..:)

希望对你有帮助

关于java - spring mvc 与 jpa 中的 Multi-Tenancy 架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23426850/

相关文章:

java - 在 Hibernate/Oracle 上执行批量更新/插入时出现异常

java - 如何在使用 hibernate 模板查询数据库的 EJB bean 中设置缓存?

java - ThreadLocal 和 @Aspect 注解

spring - 如何通过 Spring Social Facebook 注册新用户?

java - 使用 JPA 对字符串类型的数据库字段进行算术运算

java - 直接在 JPA/JPQL 中将行插入连接表?

java - 在 jpa 标准中, "in case there is at least 1 row return true"

java - Hadoop 数据从两个文件加入 - 如何强制映射器读取特定文件

java - Spring webflow booking-faces 项目中 import.sql 的名称是否重要

java - 如何使用带 SSL 的 Play WS?