为不同的客户共享Web应用程序

时间:2014-10-12 17:28:16

标签: java grails

我们的框架是Grails。假设domain.com包含一个应用程序,并且当前由某个客户端使用。如果我们想允许另一个客户端具有相同的功能但为两个客户端的数据提供分离,那么他们无法混合两者,怎么做这个?每当我们想要为这个应用程序添加n个客户端时,最好的方法是什么,以便少/无配置我们可以通过分离db来共享这些客户端的公共war文件。

实时网络开发如何处理这些类型的情况?

另外还有一点是如何提供client1.domain.com适用于client1,client2.domain.com适用于client2。如何让war文件(在Java / Grails中)像这样工作?否则,我们必须以编程方式控制项目中的客户端,以便为每个客户端允许或不必要地维护单独的war文件,这将浪费资源。

1 个答案:

答案 0 :(得分:1)

您正在描述多租户 - 为N'个租户创建一个表而不是N个相同(或接近)的表,但是使用tenant_id列对其进行分区,并使用它来过滤SQL WHERE子句中的结果。

例如,findByUsername生成的代码类似于select * from person where username='foo' and tenant_id=3' - 与常规调用相同的代码,但使用tenant_id列限制该租户的数据。

请注意,以前简单的事情(如唯一约束)现在更难了,因为您希望限制租户中的唯一性,但允许在租户之间重复使用值。在这种情况下,将唯一约束更改为在username和tenant_id的组合上工作,并在数据库中进行繁重的工作。

有一段时间有几个相关的插件,但他们依赖于调整内部API和一些功能在新的Hibernate版本中破解。但我相信http://grails.org/plugin/multi-tenant-single-db是活跃的;它是在一年前更新的,但它正在被使用。如果它看起来像你需要确保它是活跃的,请联系作者。请注意,这只适用于Hibernate 3.x。

Hibernate 4增加了对多租户的支持,但是我没有听说过它在Grails中的使用(这是预期的,因为它并不常见)。它没有很好的文档记录,但是这个错误报告突出了一些潜在的陷阱,并且应该仍然是一个有效的例子(测试应用仍然在GitHub上):https://jira.grails.org/browse/GPHIB-6

我想确保此功能正常运行,如果您以后遇到问题,请通过电子邮件告知我们。这是一个很棒的功能,在Hibernate核心中使用它可以让我们更轻松。但是我们需要使其易于使用和记录良好,并且当它在实际项目中使用时会发生得更快。