我想用JSF + Hibernate 4开发多租户应用程序。
我已经了解多租户数据库设计理论,但我需要知道Hibernate 4对我的数据库设计的具体要求。我需要在MySQL中配置或准备什么。
也许,我必须在每张桌子中添加tenantId列吗?或者我必须在MySQL数据库中准备一些选项。
我打算在我的数据库上使用共享数据库和分离的架构设计。我想知道hibernate如何使用这个策略,我是否需要首先为我的数据库中的每个租户准备架构?或者hibernate会为我做这个,所以基本上我只提供1个基本模式,而hibernate会将它复制到我的租户号码中吗?
我真的需要找到一些使用Hibernate 4多租户功能的好教程和解释。是否有任何链接或电子书建议?感谢
答案 0 :(得分:2)
我已经解决了C#中的类似问题NHibernate,但似乎你有一些概念问题而不是与特定技术有关。
我们希望为我们的"主要聚合"的不同实例分隔表格。不是因为多租户而是为了避免性能命中,当一些主要聚合影响另一个时(例如由于执行第一个"主要聚合"的更新查询;导致表锁定因此读取第二个"主要聚合&#的查询34;无法阅读任何内容。
我们做了什么:
使用可参数化的表名创建SQL脚本,例如MY_TABLE_ {0}
一旦新的"主要聚合"已创建(在您的情况下注册了新用法),第一个项目符号的脚本使用替换的占位符执行。我们有一个表,其中标识符以原子方式递增,例如它执行了类似CREATE TABLE MY_TABLE_412
...
我们以相同的方式使用命名查询。一旦我们的项目启动,一个服务的代码为每个&#34;主要聚合&#34;创建了一个会话工厂。这段代码预编译了所有&#34;主聚合&#34;的命名查询。我们存储了Dictionary <"main aggregate"_id, named queries>
我们包装了会话工厂和存储库,因此每个执行的查询都需要&#34;主聚合&#34;的标识符。所以有人打电话给MyPrettyNamedQuery
和#34;主要聚合&#34; id,此服务找到正确编译的命名查询并针对连接执行该查询。所以查询确实使用了正确的表,例如SELECT name FROM MY_TABLE_412
我们将此方法调整到我们的应用程序使用共享表的状态,其中数据库包含一个表,用于所有&#34;主要聚合&#34;但对于性能关键的子聚合,我们可以使用所描述的方法,将更多表格用于更多主要聚合。
我们的应用程序已投入生产3年,没有客户拒绝使用数据库权限来创建表。
我不确定java的Hibernate是否包含对此功能的支持,但C#并非如此,我们需要编写它。
我不建议使用一些&#34; tenant_id&#34;因为它不安全,你不能将表/模式移动到不同的数据库节点(在可扩展性的情况下),或者它可能带来令人不快的性能问题(我已经写过它)。 / p>