我曾多次阅读多租户(HERE)的Hibernate文档以及许多其他线程。
我有什么: 我有一个工作应用程序,它通过休息服务提供数据(例如产品)。
MYSQL(5.6) - > HIBERNATE(4.3.7 FINAL) - > SPRING DATA JPA(1.7.1) - > SPRING MVC(4.1.4) - > REST(杰克逊 - > json)
一切正常(CRUD)
我的应用程序中有多个表 (customer,customer_interest,products,product_tags,...)。
为什么我要问:
我想添加多租户 - >对于每个租户,应该有自己的表(tenantA_customers,tenantA_products,...)但是相同的"模板"应始终使用( - >客户对每个租户具有相同的属性)
所以我的问题是:
1)来自hibernate的SCHEMA-APPROACH如何正常工作?
2)那么它适用于多表吗?
补充资料/问题:
MultiTenantConnectionProvider示例让我感到困惑,因为它增加了"使用"声明,我认为是"使用"一个数据库? SRC:(example impl,"这种方法仅与SCHEMA方法相关。")
提前感谢您的帮助。如果有问题,请告诉我
答案 0 :(得分:2)
Hibernate使用Session
与底层数据库进行通信,Session
是JDBC连接的抽象。因此,只要应用程序代码尝试使用Hibernate执行数据库操作,Hibernate USE <schema name>
就会获得JDBC连接,然后通过所获得的连接执行常规SQL。
在多租户的架构方法中,为每个租户分配一个单独的数据库架构。这使每个租户的数据彼此分开。然后,在将JDBC连接切换到Hibernate会话之前,在JDBC连接上设置当前租户的模式。这确保了当Session在连接上执行SQL语句时,这些语句将仅在所需租户的数据上执行(由数据库模式保证)。
设置架构的SQL命令因数据库而异。您引用的示例在SQL Server和MySQL上运行良好,因为在这些数据库上选择模式的命令是{{1}}。与示例一样,根据底层数据库类型,必须使用特定于数据库的命令。
每个数据库都限制单个架构可以包含的表(或精确对象)的数量。您将不得不参考您正在使用的数据库的文档来确定每个模式可以拥有多少个数据库对象。但是,所有现代数据库支持每个模式超过100个对象,因此除非每个租户有数百万或数十亿个表,否则每个模式可以拥有的表数量应该不用担心。