【问题标题】:Configuring Hibernate to use database, whose name is not known before runtime配置 Hibernate 以使用数据库,其名称在运行前未知
【发布时间】:2011-06-29 00:05:38
【问题描述】:

我有一个在 Java 6、Spring 2.5.6 和 Hibernate 3.2.7 上运行的 Web 应用程序。现在需要从几个数据库中获取一些数据,这些数据库的名称在运行时之前是未知的。实现这一目标的最佳方法是什么?

我看过例如进入http://blog.springsource.com/2007/01/23/dynamic-datasource-routing/ 的文章,但这似乎只适用于所有数据库配置都事先知道的情况。

【问题讨论】:

    标签: java hibernate spring dynamic datasource


    【解决方案1】:

    您可以在 Java 代码中进行配置,因此您可以在运行时进行:

    http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/session-configuration.html#configuration-programmatic

    【讨论】:

    • 似乎我可以为 Configuration 对象设置一个数据源,但这仍然需要在应用程序启动之前定义所有可能的数据源(或者可能没有,这又回到了最初的问题)。
    • 您可以随时随地创建配置以及您喜欢的数量。但是,当您需要使用它们时,您也应该能够设法选择其中之一。
    【解决方案2】:

    您可以创建一个实现org.hibernate.connection.ConnectionProvider 的类。然后在你的休眠配置文件中添加这样的类:

    <property name="hibernate.connection.provider_class">my.class.that.implements.ConnectionProvider</property>
    

    您可能也希望为每个数据库使用不同的 sessionFactory。您能否提供更多关于您的应用如何在运行时发现数据库连接的信息?

    【讨论】:

    • 这是关于连接到 Quality Center 站点管理数据库的。每个 Quality Center 项目都有自己的数据库,我从表中读取其名称。每个数据库的架构都是已知的,只有数据库名称在从 QC stie 管理数据库中获取信息之前是未知的。
    • 您需要为每个连接创建一个唯一的 sessionFactory。您可以在应用程序启动时或根据需要执行此操作。您可以结合使用程序配置和基于配置的配置来执行此操作。例如,创建一个配置文件,其中包含除了 db 连接之外的所有内容。然后执行此操作: configuration.configure("hibernate.cfg.xml").setProperty("dbstuff","dbvalue")
    • @simon 另一种选择是自己创建连接。然后使用单个会话工厂: sessionFactory.openSession(connection); Javadocs 建议使用 connectionProvider 代替,因为使用此方法将禁用二级缓存。
    【解决方案3】:

    由于每个数据库的数据库结构都相同(尽管事先不知道它们的名称),我决定通过将数据库名称作为参数添加到查询中来实现它。这避免了使用多个会话工厂的资源和管理问题。

    更多信息来自这里:http://web.archive.org/web/20071011173719/http://hibernate.org/429.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-24
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 2012-06-15
      • 2013-12-14
      • 1970-01-01
      • 2011-08-19
      相关资源
      最近更新 更多