【问题标题】:Multi-user Datasources - Spring + Hibernate多用户数据源 - Spring + Hibernate
【发布时间】:2011-04-20 16:34:08
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: java spring hibernate jdbc multi-tenant


    【解决方案1】:
    【解决方案2】:

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

    Dynamic DataSource Routing

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


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

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

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

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

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

    什么缓存?

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

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

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

    据我所知。这也是我认为您必须以编程方式完成所有工作的原因。

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

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

    【讨论】:

    • 嗨帕斯卡,感谢您的回复。所有数据库都具有相同的架构,因此所有这些数据库的一个 SessionFactory 就可以了。 Hibernate 有一个二级缓存,如果我从 2 个不同的数据库加载 2 个唯一实体但具有相同的 ID,它可能包含无效的缓存数据。我想我可以通过将 DataSource 与 HttpSession 相关联,并使用拦截器将 HttpSession 中的 DataSource 附加到 ThreadLocal 来实现这一点,这样我的 AbstractDataSource impl 就可以获得事务的正确 DS。
    • Ken DeLong 文章 +1 -- 它让我省了一些麻烦 :-)
    【解决方案3】:

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

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

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

    http://www.jroller.com/kenwdelong/entry/horizontal_database_partitioning_with_spring.

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

    【讨论】:

      猜你喜欢
      • 2010-10-26
      • 2014-07-24
      • 1970-01-01
      • 1970-01-01
      • 2019-03-14
      • 1970-01-01
      • 2012-10-18
      • 2014-08-21
      • 2013-07-05
      相关资源
      最近更新 更多