【问题标题】:Creating databases at runtime with Hibernate?使用 Hibernate 在运行时创建数据库?
【发布时间】:2011-08-19 09:27:14
【问题描述】:

是否可以使用 Hibernate 在运行时创建一个新数据库(使用模型对象的注释作为模式,来自我们定义的普通模式文件),然后得到一个连接到该数据库以便可以使用它?

我们想做的是,当某个动作发生时(例如创建一个新用户),我们为该用户创建一个新数据库(从定义的注释或简单的静态模式),然后有一个处理该数据库,以便用户可以对其进行写入。

用户的东西只是为了说明概念......

谢谢!

【问题讨论】:

    标签: java mysql hibernate schema


    【解决方案1】:

    我回来晚了一点,但如果您计划构建一个多租户 SAAS 应用程序,正如您所说,您也可以使用客户 ID 等键分隔。

    在休眠状态下,过滤器可以帮助您做到这一点...

    见: http://www.lunatech-research.com/archives/2011/03/04/play-framework-writing-multitenancy-application-hibernate-filters

    这是一个播放框架的链接,但它使用休眠,所以你可以用经典的 Java EE 东西做几乎相同的事情......

    【讨论】:

    • @Sebastian Lorber - Jip,这就是我们已经实现的。这称为基于鉴别器的多租户。
    【解决方案2】:

    我前段时间在我的公司里关注过一次讨论,他们在谈论 Spring 支持这样做。

    您可能会感兴趣的一些事情: http://blog.springsource.com/2007/01/23/dynamic-datasource-routing/ http://static.springsource.org/spring/docs/3.0.x/javadoc-api/index.html?org/springframework/aop/target/HotSwappableTargetSource.html

    AbstractRoutingDataSource 似乎对您的情况很有趣。也有人说这可能是禁用第二个hibernate缓存,确认一下……

    【讨论】:

      【解决方案3】:

      同意 matt b,但你确定这样做是个好主意吗?

      我猜您有不同的客户,并希望将每个客户的数据存储在单独的数据库中(或类似的数据库)。 为什么不将所有客户数据存储在同一个数据库中,并通过客户 ID 过滤这些数据?

      【讨论】:

      • 正如我在问题中所说,我给出的客户示例就是这样,一个示例。这不是我们将要使用它的方式,但原理是相同的。此外,我们目前只是在研究不同的方法。我们正在研究的另一种方法是使用密钥(例如客户 ID)进行分隔。
      • 我亲自查找这个问题的原因是由于我的客户非常严格的安全条款需要单独的数据库方法。要求他们的数据与其组织存储在同一个国家/地区,因此我们需要能够为多个数据库提供服务。
      【解决方案4】:

      在高层次上,要完成这样的事情,你会做的是:

      1. 当触发事件发生时,执行 DDL 以通过 JDBC 连接创建一个新的数据库 - 对于由 hbm2ddl 在构建时生成的此架构可能最有意义。

      2. 为此数据库构造一个新的DataSource,并从DataSource 中构造一个新的SessionFactory

      3. 然后应该将这个SessionFactory 注入(或由其查找)应用程序的数据访问层,以便为用户找到合适的SessionFactory

      简而言之,答案是为每个连接/数据库动态构造SessionFactory 实例,并确保您的数据访问层知道如何为条件找到合适的SessionFactory

      【讨论】:

      • 这似乎是最合乎逻辑的解决方案。这是可扩展的吗?单个应用程序可以容纳多少个会话工厂(及其数据源)?
      • 我不知道,但如果你做一些基准测试和测试,我很乐意看到结果:)
      猜你喜欢
      • 2013-05-24
      • 2013-08-10
      • 1970-01-01
      • 2010-11-04
      • 1970-01-01
      • 1970-01-01
      • 2017-02-11
      • 2015-07-28
      • 1970-01-01
      相关资源
      最近更新 更多