16

我正在编写一个支持多个用户的网络应用程序。每个用户都有自己的数据库 - 使用 H2。所有数据库模式都是相同的。

我希望在这个应用程序中使用 Spring + Hibernate。

所以我被困在如何将用户的数据库与该用户相关联 - 可能在 HTTPSession 中关联它,并扩展 spring 的 AbstractRoutingDataSource?但这不会影响 Hibernate 的缓存吗?另一种方法是每个数据源都有一个 SessionFactory,即使每个数据源的模式都是相同的......所以我认为这是一种浪费。

无论如何选择数据源需要是动态的——它们不能在上下文文件中预先配置,因为每个新用户都会创建自己的数据库。是否有任何现有的框架/解决方案?

我对 Hibernate Shards 不太了解,也许这行得通?

4

3 回答 3

8

正如一些资源所建议的那样,我对(严格)每个数据库都需要一个可能是错误的:SessionFactory

动态数据源路由

明天我会花一些时间重新阅读所有内容(说实话,我没有得到所有细节)并完全理解这种设置的含义(尽管它似乎很明显会破坏二级缓存) . 我稍后会回来讨论这个问题。


我正在编写一个支持多个用户的网络应用程序。每个用户都有自己的数据库 - 使用 H2。所有数据库模式都是相同的。

我想知道这将如何扩展……您有多少用户?你如何运行H2,什么模式?

所以我被困在如何将用户的数据库与该用户相关联 - 可能在 HTTPSession 中关联它,并扩展 spring 的 AbstractRoutingDataSource?

您必须为SessionFactory每个用户构建一个并将其与登录用户相关联(在 a 中Map,使用登录作为键),然后Session从给定的SessionFactory. 将生命周期绑定SessionFactory到 HTTP 会话似乎是一个好主意(以节省一些内存),但我不确定 Spring 在这里是否会很有帮助。我可能错了,但是HibernateUtil类的变体和完全编程的方法看起来更容易。顺便说一下,我不确定每个用户是否需要多个连接。

但这不会影响 Hibernate 的缓存吗?

什么缓存?

另一种方法是每个数据源都有一个 SessionFactory,即使每个数据源的模式都是相同的......所以我认为这是一种浪费。

哦,这是一种浪费,但这就是您想要做的(每个用户一个数据库)。而且您别无选择(SessionFactory每个数据库都需要一个)。为什么实际上每个用户需要一个数据库?你确定这是一个明智的决定吗?正如已经暗示的那样,这意味着很多麻烦,不能很好地扩展,增加复杂性等等。为什么不使用单个数据库并将数据关联到用户呢?

无论如何选择数据源需要是动态的——它们不能在上下文文件中预先配置,因为每个新用户都会创建自己的数据库。是否有任何现有的框架/解决方案?

据我所知不是。这也是为什么我认为你必须以编程方式完成所有事情。

我对 Hibernate Shards 不太了解,也许这行得通?

鉴于您的应用程序的动态需求,我看不出它有什么帮助。

于 2010-10-04T21:24:20.160 回答
3

这可能会帮助您:

于 2010-10-04T08:01:32.913 回答
1

感谢 2 个人(Pascal 和 org.life.java)的帮助!

这是可能的,但有一些问题:例如休眠二级缓存/查询缓存。

Pascal 提供的这个链接是一个非常好的资源:

http://www.jroller.com/kenwdelong/entry/horizo​​ntal_database_partitioning_with_spring

我给每个用户一个单独的数据库的主要动机是因为数据可能会快速增长,因此需要水平分区。

于 2010-10-06T09:09:09.673 回答