多用户数据源 - 春季 + 休眠

2022-09-03 07:32:34

我正在编写一个支持多个用户的 Web 应用。每个用户都有自己的数据库 - 使用H2。所有数据库架构都相同。

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

因此,我陷入了如何将用户的数据库与该用户相关联的问题 - 也许在HTTPSession中将其关联,并扩展spring的AbstractRoutingDataSource?但这不会影响Hibernate的缓存吗?另一种方法是为每个数据源创建一个会话工厂,即使每个数据源的架构都是相同的...所以我认为这是一种浪费。

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

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


答案 1

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

动态数据源路由

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


我正在编写一个支持多个用户的 Web 应用。每个用户都有自己的数据库 - 使用H2。所有数据库架构都相同。

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

因此,我陷入了如何将用户的数据库与该用户相关联的问题 - 也许在HTTPSession中将其关联,并扩展spring的AbstractRoutingDataSource?

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

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

什么缓存?

另一种方法是为每个数据源创建一个会话工厂,即使每个数据源的架构都是相同的...所以我认为这是一种浪费。

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

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

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

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

考虑到应用程序的动态需求,我看不出它有什么帮助。


推荐