使用Spring JPA的多租户

我正在寻找一个针对我的Web应用程序的多租户解决方案。 我想用Separate Schema Model实现一个应用程序。 我想每个会话都有一个数据源。 为了做到这一点,我把datasource和entitymanger放在会话范围内,但那不起作用。 我想在用户输入用户名和密码以及tenantId时加载data-access-context.xml(包括数据源和其他存储库bean)文件。 我想知道它是否是一个很好的解决方案?

多租户是一个有点棘手的主题,它必须在JPA提供者端处理,以便从客户端代码的角度来看,没有或几乎没有任何变化。 eclipselink支持多租户(参见: EclipseLink / Development / Indigo / Multi-Tenancy ), hibernate最近刚刚添加了它。

另一种方法是使用AbstractRoutingDataSource ,参见: Hibernate中的多租户 。

使用会话范围风险太大(同样,最终会有数千个数据库连接,每个会话/用户都很少。最后, EntityManager和底层数据库连接不可序列化,因此您无法迁移会话并正确扩展应用程序。

我曾与多个多租户系统合作过。 这里面临的挑战是如何保持

  1. 开放的架构和
  2. 提供随业务发展的解决方案。

让我们先看看第二个挑战。 多租户系统倾向于在需要支持的情况下发展,其中多个具有不同容量的租户可以访问相同的数据(记录)(例如https://bugs.eclipse.org/bugs/show_bug.cgi) ?id = 355458 )。 因此,系统最终需要访问控制列表。

要保持开放式架构,您可以编写标准代码(如JPA)。 编写EclipseLink或Hibernate让我感到不舒服。

Spring Security ACL为这两个挑战提供了非常灵活的社区支持解决方案。 试一试。 我做到了并且对它的表现感到满意。 但是,我必须提醒你,我需要花一些时间来解决它。