【问题标题】:Multi-Tenancy with Hibernate and Spring Data JPA, how does schema approach work使用 Hibernate 和 Spring Data JPA 的多租户,模式方法如何工作
【发布时间】:2015-05-08 03:24:13
【问题描述】:

我已经多次阅读 Hibernate 多租户文档 (HERE) 以及许多其他线程。

我有什么: 我有一个工作应用程序,它通过休息服务提供数据(例如产品)。

MYSQL(5.6) -> HIBERNATE(4.3.7 FINAL) -> SPRING DATA JPA (1.7.1) -> SPRING MVC (4.1.4) -> REST (jackson -> json)

一切正常(CRUD)

我的应用程序中有多个表 (customers, customer_interest, products, product_tags, ...)。

我为什么要问:

我想为每个租户添加多租户 -> 应该有自己的表(tenantA_customers,tenantA_products,...)但应该始终使用相同的“模板”(-> 客户对每个租户都有相同的属性租户)

所以我的问题是:

1) hibernate 的 SCHEMA-APPROACH 是如何工作的?

2) 那么它是否适用于多表?

补充信息/问题:

  • 不会有那么多租户(肯定

MultiTenantConnectionProvider 的例子让我有点困惑,因为它添加了“使用”语句,我以为是“使用”数据库? SRC: (example impl,"这种方法只与 SCHEMA 方法有关。")

提前感谢您的帮助。如果有什么不清楚的地方请告诉我

【问题讨论】:

  • 您可能会感到困惑,因为 MySQL 将“模式”称为“数据库”。 MySQL 中只有一个真正的数据库,并且您可以有很多模式。其他数据库服务器有多个具有多个模式的数据库。

标签: hibernate spring-mvc spring-data-jpa multi-tenant


【解决方案1】:

Hibernate 使用Session 与底层数据库进行通信,Session 是 JDBC 连接的抽象。因此,每当应用程序代码尝试使用 Hibernate 执行数据库操作时,Hibernate Session 会获取一个 JDBC 连接,然后通过这样获得的连接执行常规 SQL。

在多租户的架构方法中,每个租户都分配有一个单独的数据库架构。这使每个租户的数据彼此分开。然后,在将 JDBC 连接交给 Hibernate Session 之前,在 JDBC 连接上设置当前租户的 schema。这确保了当 Session 在连接上执行 SQL 语句时,这些语句将仅在所需租户的数据上执行(由数据库架构保证)。

用于设置架构的 SQL 命令因数据库而异。您提到的示例将在 SQL Server 和 MySQL 上运行良好,因为在这些数据库上选择架构的命令是 USE <schema name>。就像上面提到的示例一样,必须根据底层数据库类型使用特定于数据库的命令。

每个数据库对单个模式可以包含的表(或准确地说是对象)的数量都有限制。您必须参考您正在使用的数据库的文档,以确定每个模式可以拥有多少个数据库对象。但是,所有现代数据库都支持每个架构超过 100 个对象,因此您不必担心每个架构可以拥有的表数量,除非您每个租户有数百万或数十亿个表。

【讨论】:

  • 谢谢,这让事情变得更清楚了。仍在为实施而苦苦挣扎。
猜你喜欢
  • 2014-02-12
  • 2017-10-23
  • 2014-04-07
  • 2014-12-22
  • 2019-06-15
  • 1970-01-01
  • 2019-06-23
  • 2017-11-19
  • 2016-05-03
相关资源
最近更新 更多