2008-09-23 98 views
8

我已经给出了一个需求,我需要在同一个实例中支持多个数据库,以支持多租户。每个数据库具有相同的模式。用户通过从列表中选择来登录到特定数据库,并且所有后续调用都将转到该数据库,直到他们注销。Spring/Hibernate下的多个会话工厂

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

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

这样做最简单的方法是什么?为DaoTemplate配置HotSwappableTarget?任何人都可以指点我如何做到这一点?

回答

2

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

我成功地使用这种方法来支持多租户。

+0

好主意 - 但您如何切换承租人感知缓存?你所能做的只是配置一个缓存提供程序,而hibernate使用它来创建一个缓存。也许实现一个CacheProvider,然后生成一个承租人感知缓存包装? – Verdant 2008-09-24 10:08:43

0

你也可以看看Hibernate的碎片项目:

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

...其重点是增加对水平分区到Hibernate的核心支持。它还没有涵盖完整的Hibernate API,但确实支持它的很大一部分(这可能或可能不足以满足您的需求)。当然,他们正在努力实现全面覆盖。

2

我在哪里工作过,我们通过ThreadLocal完成了以下操作this guide.我们只使用了一个SessionFactory,并根据用户在登录时可能更改的会话变量交换了它的数据源。我不记得确切的详细信息,但是如果您我有兴趣了解更多关于实施的信息。

虽然这么说,我以前的工作场所的人现在正在摆脱这种方法,走向分片数据库。绝对是一个更优雅的解决方案,我建议你看看。

1

延伸远离的HibernateDaoSupport的DAO类,然后调用的setSessionFactory()方法,做数据库

0

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