使用Hibernate在运行时创建数据库?

4
是否可以使用Hibernate在运行时创建新的数据库(使用模型对象的注释作为模式,或者使用我们定义的普通模式文件),然后获取到该数据库的连接以便使用?
我们想做的是,在发生某些操作时(例如创建新用户),我们为该用户创建一个新的数据库(从定义的注释或静态模式中),然后拥有该数据库的句柄,以便用户可以向其写入。
注意:这里的“用户”只是用于说明概念...
谢谢!
4个回答

6

从高层次上来说,您需要执行以下步骤才能完成这样的操作:

  1. 当触发事件发生时,通过JDBC连接执行DDL以创建一个新的数据库-可能最合理的方式是在构建时由hbm2ddl生成此模式。

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

  3. 然后应将此SessionFactory注入(或查找)应用程序的数据访问层,以查找适当的SessionFactory以获取用户。

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


1
这似乎是最合理的解决方案。但它是否可扩展呢?单个应用程序可以持有多少个会话工厂(及其数据源)? - Nico Huysamen
我不知道,但如果你进行一些基准测试,我很想看到结果 :) - matt b

1

@Sebastian Lorber - 是的,这就是我们实现的内容。它被称为基于鉴别器的多租户。 - Nico Huysamen

1

同意matt b的观点,但您确定这样做是一个好主意吗?

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


正如我在问题中所说,我给出的客户示例只是一个例子,这不是我们使用的方式,但原则是相同的。此外,目前我们只是在研究不同的方法。另一种方法是通过使用键(例如客户ID)进行分离。 - Nico Huysamen
我个人查找这个问题的原因是由于我的客户有非常严格的安全条款,需要采用分离的数据库方法。他们要求数据存储在与其组织相同的国家,因此我们需要能够提供多个数据库服务。 - Jordan Mackie

1

我曾经在公司里听到过一次关于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缓存,需要确认...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接