java - 如何实现 "Shared database, separate schema" Multi-Tenancy 策略

标签 java database-design cloud saas multi-tenant

我必须使用共享数据库独立模式方法使 Web 应用程序启用 Multi-Tenancy 。该应用程序是使用 Java/J2EE 和 Oracle 10g 构建的。

我需要有一个单一的应用程序服务器使用具有多个模式的共享数据库,每个客户端一个模式。

实现此目标的最佳实现方法是什么?

  • 需要在中间层(应用程序服务器)级别做什么?
  • 每个客户端是否需要多个主机 header ?
  • 如何根据访问应用程序的客户端动态连接到正确的架构?

最佳答案

在高层次上,这里有一些需要考虑的事情:

  • 您可能希望在日常开发中隐藏租赁注意事项。因此,您可能希望尽可能地将它隐藏在您的基础架构中,并将其与您的业务逻辑分开。您不想总是检查您是否处于哪个租户的上下文中……您只想处于该上下文中。
  • 如果您使用的是工作单元模式,您需要确保任何工作单元(除了在纯基础设施上下文中运行的工作单元,而不是在业务上下文中运行的单元)都在一个租户的上下文中执行.如果您没有使用工作单元模式……也许您应该使用。不确定您将如何遵循上述建议(尽管您可能会想出办法)。
  • 您可能希望将租户 ID 放入每个消息传递或 HTTP 请求的 header 中。最好将其保留在主体之外,原则是使其远离业务逻辑。您可以在幕后删除它,并确保在幕后将其放入任何传出消息/请求中。
  • 我不熟悉 Oracle,但在 SQL Server 中,我相信在 Postgres 中,您可以使用模拟作为切换租户的方式。也就是说,不是在每个 SQL 命令和查询中都参数化模式,您可以只让一个 SQL 用户(没有关联的登录名)将关联租户的模式作为其默认模式,然后将模式从你的日常 SQL。您将不得不拦截对数据库的调用并将它们包装在模拟调用中。就像我说的,我不太确定这在 Oracle 中是如何实现的,但这是 SQL Server 的一般想法。
  • 身份验证和安全性是这里的一个大问题。这远远超出了我在此答案中可以讨论的范围,但请确保您做对了

关于java - 如何实现 "Shared database, separate schema" Multi-Tenancy 策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3360762/

相关文章:

数据库在云端?

java - 我在 Spring Boot 中调用 API 时遇到 404 错误

java - Retrofit 2 的自定义 CallAdapter 和 Android 上的线程问题

java - 如何对具有动态属性的对象进行建模?

java - Maven 在构建期间排除文件

database - 多个父对象的注释

mysql - 在 MySQL 表中存储运费,将来会添加许多列

Google App Engine 上的 Java 应用程序?

mysql - 用户设置的数据库表结构

c# - 代码在本地 Windows 2008 上运行正常,但无法在 Azure 云上的应用程序数据中创建子文件夹