我的企业应用程序架构中遇到了一个严重的问题。我当前的应用程序是一个使用 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/