我正在编写一个支持多个用户的Web应用程序。每个用户都有自己的数据库-使用H2。所有数据库架构都是相同的。
我希望将Spring + Hibernate用于此应用程序。
因此,我坚持如何将用户的数据库与该用户相关联- 也许将其与HTTPSession关联,并扩展spring的AbstractRoutingDataSource?但这不会影响Hibernate的缓存吗?另一种方法是为每个数据源都配备一个SessionFactory,即使每个数据源的架构都相同…所以我认为这是浪费。
无论如何,选择数据源都必须是动态的-不能在上下文文件中对其进行预配置,因为每个新用户都将创建自己的数据库。有没有现有的框架/解决方案?
我对Hibernate Shards不太了解,也许行得通吗?
我 可能 错了(严格)SessionFactory每个数据库必须有一个数据库(如某些资源所建议的那样):
SessionFactory
动态数据源路由
我将花一些时间明天重新阅读所有内容(坦白地说,我并没有获得所有详细信息)并完全理解这种设置的含义(尽管似乎很明显,它将破坏二级缓存) 。我稍后再讲。
我不知道这将如何扩展…您有多少用户?您如何运行H2,采用哪种模式?
因此,我坚持如何将用户的数据库与该用户相关联- 也许将其与HTTPSession关联,并扩展spring的AbstractRoutingDataSource?
您必须构建一个SessionFactory每个用户,并将其与登录的用户相关联(在中Map,使用登录名作为键),然后Session从给定的中获取一个SessionFactory。将生命周期绑定SessionFactory到HTTP会话似乎是一个好主意(以节省一些内存),但是我不确定Spring在这里是否会很有帮助。我可能是错的,但是HibernateUtil类的变化和完全编程的方法看起来更容易。我不确定您是否需要每个用户多个连接。
Map
Session
HibernateUtil
但这不会影响Hibernate的缓存吗?
什么缓存?
另一种方法是为每个数据源都配备一个SessionFactory,即使每个数据源的架构都相同…所以我认为这是浪费。
哦,这很浪费,但这就是您想要做的(每个用户一个数据库)。而且您别无选择(SessionFactory每个数据库需要一个)。为什么实际上每个用户需要一个数据库?您确定这是一个明智的决定吗?正如已经暗示的那样,这意味着很多麻烦,无法很好地扩展,增加了复杂性等。为什么不使用单个数据库并将数据与用户相关联呢?
据我所知。这也是为什么我认为您必须以编程方式执行所有操作的原因。
鉴于您的应用程序的动态需求,我看不出它有什么帮助。