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

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

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

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

有帮助吗?

解决方案

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

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

其他提示

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

您还可以查看Hibernate Shards项目:

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top