2012-03-15 192 views
3

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

回答

2

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

另一种方法是使用AbstractRoutingDataSource,参见:Multi tenancy in Hibernate

使用会话范围风险太大(同时你最终会得到数千个数据库连接,每个会话/用户都会得到很少的连接,最后EntityManager和底层数据库连接是不可序列化的,所以你不能迁移你的会话并扩展你的应用程序正常。

+2

当您使用SessionFactory(即Hibernate native)而不是JPA(@ PersistenceContext/EntityManager)时,Hibernate仅支持多租户。 – pap 2012-03-15 11:07:30

+0

嗨,谢谢你的回答。这真的很有帮助。而你说得对。它不支持JPA。但我选择使用'AbstractRoutingDataSource'。但问题是现在数据源和实体管理器bean在启动时初始化。有没有办法在春季配置这种方式,它将在用户认证后初始化? – mettok 2012-03-15 12:59:39

+0

@ user1057347:请打开一个新问题,这太复杂了,不能在评论中解释(并且在将来不会有足够的支持)。还请发布一个新问题的链接,以便我可以跟进。 – 2012-03-15 13:02:39

0

我曾与一些多租户系统的工作。这里的挑战是如何保持

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

让我们先看看第二个挑战。多租户系统有发展的趋势,您需要支持多个拥有不同容量的租户可访问同一数据(记录)的用例(例如https://bugs.eclipse.org/bugs/show_bug.cgi?id=355458)。所以,系统最终需要访问控制列表。

为了保持开放式体系结构,您可以编码为标准(如JPA)。编码到EclipseLink或Hibernate让我感到不舒服。

Spring Security ACL为这些挑战提供了非常灵活的社区支持解决方案。试试看。我对它的表现感到满意。但是,我必须告诫你,我花了一些时间来探索它。