我正在编写一个支持多个用户的网络应用。每个用户都有自己的数据库 - 使用H2。所有数据库模式都是一样的。
我希望将Spring + Hibernate用于此应用程序。
所以我坚持如何将用户的数据库与该用户关联 - 可能在HTTPSession中关联它,并扩展spring的AbstractRoutingDataSource?但这不会影响Hibernate的缓存吗?另一种方法是使用每个数据源的SessionFactory,即使每个数据源的模式都相同......所以我认为这是一种浪费。
无论如何选择数据源需要是动态的 - 它们不能在上下文文件中预先配置,因为每个新用户都将创建自己的数据库。有没有现有的框架/解决方案?
我对Hibernate Shards不太了解,也许这有用吗?
答案 0 :(得分:8)
我可能错误地认为(严格)每个数据库需要一个SessionFactory
,如某些资源所示:
我将花一些时间重新阅读明天的所有内容(我没有得到所有细节,说实话)并完全理解这种设置的含义(尽管很明显它会打破第二个 - 级别缓存)。我稍后会再回来。
我正在编写一个支持多个用户的网络应用。每个用户都有自己的数据库 - 使用H2。所有数据库模式都是一样的。
我想知道这会如何扩展...你有多少用户?你怎么运行H2,什么模式?
所以我坚持如何将用户的数据库与该用户相关联 - 可能在HTTPSession中关联它,并扩展spring的AbstractRoutingDataSource?
您必须为每个用户构建一个SessionFactory
并将其与已登录用户关联(在Map
中,使用登录为关键字),然后从中获取Session
给定SessionFactory
。将SessionFactory
的生命周期绑定到HTTP会话似乎是一个好主意(为了节省一些内存),但我不确定Spring在这里会非常有用。我可能错了,但HibernateUtil
类的变体和完全编程方法看起来更容易。我不确定顺便说一句,每个用户都需要多个连接。
但这不会影响Hibernate的缓存吗?
什么缓存?
另一种方法是使用每个数据源的SessionFactory,即使每个数据源的模式都相同......所以我认为这是一种浪费。
哦,这是浪费,但这就是你想要做的(每个用户一个数据库)。并且您没有选择(每个datadabase需要一个SessionFactory
)。为什么每个用户实际上需要一个数据库?你确定这是一个明智的决定吗?正如已经暗示的那样,这意味着很多麻烦,不能很好地扩展,增加复杂性等。为什么不使用单个数据库并将数据与用户关联?
无论如何选择数据源需要是动态的 - 它们不能在上下文文件中预先配置,因为每个新用户都将创建自己的数据库。有没有现有的框架/解决方案?
据我所知。这也是我认为你必须以编程方式完成所有事情的原因。
我对Hibernate Shards不太了解,也许这有用吗?
鉴于您的应用程序的动态需求,我不知道它可以提供什么帮助。
答案 1 :(得分:3)
答案 2 :(得分:1)
感谢2人的帮助(Pascal和org.life.java)!
有可能,但有一些问题:例如: hibernate二级缓存/查询缓存。
Pascal提供的这个链接是一个非常好的资源:
http://www.jroller.com/kenwdelong/entry/horizontal_database_partitioning_with_spring
我给每个用户一个单独数据库的主要动机是因为数据可能会快速增长,因此需要进行水平分区。