2010-10-04 107 views
16

我在写一个支持多用户的web应用程序。每个用户都有自己的数据库 - 使用H2。所有的数据库模式都是一样的。多用户数据源 - Spring +休眠

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

所以我停留在如何将用户的数据库与该用户联系起来 - 春天的AbstractRoutingDataSource也许在HttpSession相关的它,并延长?但不会影响Hibernate的缓存吗?另一种方法是为每个数据源分配一个SessionFactory,尽管每个数据源的模式都是一样的......所以我认为这是浪费。

不管怎么说选择数据源需要是动态的 - 在上下文中的文件不能被预先配置,为每个新用户将拥有自己的数据库中创建。有没有现有的框架/解决方案?

我不太了解Hibernate Shards,也许这有效?

回答

8

可能是错的(严格)需要有每个数据库都有一个SessionFactory,所建议的一些资源:

我会花一些时间来重新阅读一切明天(我没有得到所有细节要诚实),并完全理解这种设置的影响(尽管它似乎很清楚它会打破二级缓存)。我稍后再回来。


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

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

因此,我被困在如何将用户的数据库与该用户相关联 - 可能与HTTPSession相关联,并扩展了Spring的AbstractRoutingDataSource?

你必须建立一个SessionFactory每个用户和它关联到登录的用户(在Map,使用登录为重点),然后获得一个给定的SessionFactory一个Session。将SessionFactory的生命周期绑定到HTTP会话似乎是个好主意(以节省一些内存),但我不确定Spring在这里会非常有帮助。我可能是错误的,但是HibernateUtil类的变体,完全程序化的方法看起来更容易。顺便说一下,我不确定你需要每个用户有多个连接。

但不会这种效果Hibernate的缓存?

什么缓存?

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

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

反正选择数据源需要动态 - 它们不能在上下文文件中预先配置,因为每个新用户都将创建自己的数据库。有没有现有的框架/解决方案?

不是我所知。这也是为什么我认为你必须以编程方式做所有事情的原因。

我不知道太多关于Hibernate的碎片,也许这工作?

鉴于您的应用程序的动态需求,我不明白它可以提供什么帮助。

+0

嗨帕斯卡尔,感谢您的回复。 所有数据库都具有相同的模式,因此所有这些数据库的一个SessionFactory都可以。 如果我从2个不同的数据库加载2个唯一的实体但具有相同的ID,Hibernate有2级缓存,可能包含无效的缓存数据。 我想我可以通过将DataSource与HttpSession关联,并使用Interceptor将HttpSession中的DataSource附加到ThreadLocal,以便我的AbstractDataSource impl可以获取正确的事务DS。 – Dzhu 2010-10-04 21:59:11

+0

Ken DeLong文章+1,它为我节省了一些头痛:-) – opyate 2011-03-30 21:42:02