8

我被要求在同一个实例中支持多个数据库,以支持多租户。每个数据库都有一个相同的模式。用户通过从列表中选择登录到特定数据库,所有后续调用都将转到该数据库,直到他们注销。

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

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

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

4

5 回答 5

2

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

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

于 2008-09-23T12:29:42.240 回答
2

在我以前工作的地方,我们按照本指南通过 ThreadLocal 完成了这项工作。我们只使用了一个 SessionFactory 并根据用户在登录时可以更改的会话变量交换它的数据源。我不记得确切的细节,但如果你有兴趣,我可以挖掘更多关于我们实现的信息。

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

于 2008-09-27T21:32:49.693 回答
1

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

于 2009-07-05T13:12:39.127 回答
0

您还可以查看 Hibernate Shards 项目:

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

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

于 2008-09-23T12:43:41.007 回答
0

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

于 2010-01-15T06:40:29.650 回答