使用 Hibernate 和 Spring Data JPA 的多租户,模式方法如何工作
Multi-Tenancy with Hibernate and Spring Data JPA, how does schema approach work
我已经多次阅读 Hibernate 多租户文档 (HERE) 以及许多其他线程。
我有:
我有一个工作应用程序,它通过休息服务提供数据(例如产品)。
MYSQL(5.6) -> 休眠(4.3.7 最终版本) -> SPRING 数据 JPA (1.7.1) -> SPRING MVC (4.1.4) - > 休息(杰克逊 -> json)
一切正常(CRUD)
我的应用程序中有多个表
(客户,customer_interest,产品,product_tags,...)。
我为什么要问:
我想添加多租户 -> 对于每个租户,应该有自己的表(tenantA_customers、tenantA_products、...)但是相同的 "template" 应该总是被使用(-> 客户对每个租户具有相同的属性)
所以我的问题是:
1) hibernate 的 SCHEMA-APPROACH 是如何工作的?
2) 那么它适用于多表吗?
加法information/Question:
- 不会有那么多租户(肯定<50)
MultiTenantConnectionProvider 示例让我有点困惑,因为它添加了 "use" 语句,我以为它是 "use" 数据库?
SRC: (example impl ,"This approach is only relevant to the SCHEMA approach.")
提前感谢您的帮助。如果有什么不明之处请告诉我
Hibernate 使用 Session
与基础数据库通信,Session
是对 JDBC 连接的抽象。因此,每当应用程序代码尝试使用 Hibernate 执行数据库操作时,Hibernate Session
获得一个 JDBC 连接,然后在如此获得的连接上执行常规 SQL。
在多租户模式方法中,每个租户都被分配了一个单独的数据库模式。这使每个租户的数据彼此分离。然后,在 JDBC 连接交给 Hibernate Session 之前,在 JDBC 连接上设置当前租户的模式。这确保了当 Session 在连接上执行 SQL 语句时,这些语句将仅在所需租户的数据上执行(由数据库架构保证)。
设置架构的SQL命令因数据库而异。您提到的示例在 SQL 服务器和 MySQL 上运行良好,因为选择模式的命令在这些数据库上是 USE <schema name>
。就像示例中提到的那样,必须根据基础数据库类型使用特定于数据库的命令。
每个数据库对单个模式可以包含的表(或准确地说是对象)的数量都有限制。您必须参考所用数据库的文档以确定每个模式可以拥有多少个数据库对象。但是,所有现代数据库都支持每个模式超过 100 个对象,因此除非每个租户有数百万或数十亿个表,否则每个模式可以拥有的表数量不应该担心。
我已经多次阅读 Hibernate 多租户文档 (HERE) 以及许多其他线程。
我有: 我有一个工作应用程序,它通过休息服务提供数据(例如产品)。
MYSQL(5.6) -> 休眠(4.3.7 最终版本) -> SPRING 数据 JPA (1.7.1) -> SPRING MVC (4.1.4) - > 休息(杰克逊 -> json)
一切正常(CRUD)
我的应用程序中有多个表 (客户,customer_interest,产品,product_tags,...)。
我为什么要问:
我想添加多租户 -> 对于每个租户,应该有自己的表(tenantA_customers、tenantA_products、...)但是相同的 "template" 应该总是被使用(-> 客户对每个租户具有相同的属性)
所以我的问题是:
1) hibernate 的 SCHEMA-APPROACH 是如何工作的?
2) 那么它适用于多表吗?
加法information/Question:
- 不会有那么多租户(肯定<50)
MultiTenantConnectionProvider 示例让我有点困惑,因为它添加了 "use" 语句,我以为它是 "use" 数据库? SRC: (example impl ,"This approach is only relevant to the SCHEMA approach.")
提前感谢您的帮助。如果有什么不明之处请告诉我
Hibernate 使用 Session
与基础数据库通信,Session
是对 JDBC 连接的抽象。因此,每当应用程序代码尝试使用 Hibernate 执行数据库操作时,Hibernate Session
获得一个 JDBC 连接,然后在如此获得的连接上执行常规 SQL。
在多租户模式方法中,每个租户都被分配了一个单独的数据库模式。这使每个租户的数据彼此分离。然后,在 JDBC 连接交给 Hibernate Session 之前,在 JDBC 连接上设置当前租户的模式。这确保了当 Session 在连接上执行 SQL 语句时,这些语句将仅在所需租户的数据上执行(由数据库架构保证)。
设置架构的SQL命令因数据库而异。您提到的示例在 SQL 服务器和 MySQL 上运行良好,因为选择模式的命令在这些数据库上是 USE <schema name>
。就像示例中提到的那样,必须根据基础数据库类型使用特定于数据库的命令。
每个数据库对单个模式可以包含的表(或准确地说是对象)的数量都有限制。您必须参考所用数据库的文档以确定每个模式可以拥有多少个数据库对象。但是,所有现代数据库都支持每个模式超过 100 个对象,因此除非每个租户有数百万或数十亿个表,否则每个模式可以拥有的表数量不应该担心。