Spring / Hibernate下的多个会话工厂

时间:2008-09-23 09:15:26

标签: hibernate spring sessionfactory

我已经获得了一个要求,我需要在同一个实例中支持多个数据库,以支持多租户。每个DB都具有相同的架构。用户通过从列表中选择登录到特定数据库,并且所有后续调用将转到该数据库,直到他们注销为止。

我想根据客户端提供的参数在单个HibernateDaoTemplate内热交换会话工厂。

我可以在热交换数据源上找到很多东西(以及与之相关的所有事务问题),但我想热交换会话工厂 - 保留每个工具的所有缓存。

最简单的方法是什么?为DaoTemplate配置HotSwappableTarget?谁能指点我如何做这个样本?

5 个答案:

答案 0 :(得分:2)

如果所有数据库都相同,那么我可以建议使用单个SessionFactory并为DataSource和Cache提供实际上“租户意识”的实现。 (实现这些是相当简单的:只需维护租户ID的地图 - >真实缓存/真实数据源,然后将所有调用委托给相应的一个)。配置单个SessionFactory以使用您的租户感知缓存和数据源。 ThreadLocal可用于使当前请求的租户ID可用于需要了解它的任何代码。

在成功支持多租户之前,我已经使用过这种方法。

答案 1 :(得分:2)

我曾经工作的地方我们在this guide.之后通过ThreadLocal做到了这一点我们只使用了一个SessionFactory并根据用户在登录时可以更改的会话变量交换了它的数据源。我不记得确切的细节,但是如果你感兴趣我可以挖掘一些关于我们实施的更多信息。

尽管如此,我以前工作场所的人现在正在逐渐远离这种方法,转向分片数据库。绝对是一个更优雅的解决方案,我建议你去看看。

答案 2 :(得分:1)

从HibernateDaoSupport扩展你的DAO类,然后调用setSessionFactory()方法,进行数据库的热插拔

答案 3 :(得分:0)

您还可以查看Hibernate Shards项目:

http://www.hibernate.org/414.html

...专注于为Hibernate Core添加对水平分区的支持。它尚未涵盖完整的Hibernate API,但确实支持其中很大一部分(可能满足您的需求,也可能不足以满足您的需求)。当然,他们正在努力实现全面覆盖。

答案 4 :(得分:0)

我还通过ThreadLocal尝试了缓存提供程序,困难的部分是在缓存上进行热交换,你必须确保SessionFactory没有任何与之关联的活动会话。现在,我认为有一个更好的解决方案:通过使用Spring 3 java配置,您可以动态创建租户感知的SessionFactory,让Spring为您进行缓存管理。