【问题标题】:Hibernate database connection configurationHibernate 数据库连接配置
【发布时间】:2011-01-26 04:04:09
【问题描述】:

我们有 2 个不同的服务器环境使用相同的 Hibernate 配置。一台服务器具有对数据源的 JNDI 支持,而另一台则没有。目前,Hibernate 配置配置为使用 JNDI,这会导致不支持 JNDI 的服务器出现问题。

我也尝试将直接 JDBC 配置与 JNDI 配置一起放入配置文件中,但如果两者都存在,hibernate 似乎总是偏爱 JNDI 而不是直接 JDBC 配置。

我的问题是,如果 JNDI 和 connection_provider 配置都存在,会不会一样? Hibernate 是否仍会通过 connection_provider 使用 JNDI?或者有什么办法可以改变数据库连接属性的优先级?

我没有一直访问服务器,所以我想我确实在服务器时间窗口之前提出了这个问题。

提前致谢。

【问题讨论】:

    标签: java hibernate orm jdbc


    【解决方案1】:

    我们有 2 个不同的服务器环境使用相同的 Hibernate 配置。

    好吧,这可能不是预期的答案,但我觉得您自己在这里制造了问题:如果您的环境不同,请使用不同的配置。 会做的事情如下:

    • 把所有常见的东西都放在hibernate.cfg.xml(捆绑在应用程序中)
    • 将特定的东西放在hibernate.properties 文件中,并将“正确的”放在每个应用程序(但应用程序之外)类路径的根目录中。

    例如,这将是“JNDI 环境”的hibernate.properties 的内容:

    hibernate.connection.datasource = java:/comp/env/jdbc/test
    hibernate.transaction.factory_class = org.hibernate.transaction.JTATransactionFactory
    hibernate.transaction.manager_lookup_class = org.hibernate.transaction.JBossTransactionManagerLookup
    hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
    

    这将是“非 JNDI 环境”的 hibernate.properties 的内容:

    hibernate.connection.driver_class = org.postgresql.Driver
    hibernate.connection.url = jdbc:postgresql://localhost/mydatabase
    hibernate.connection.username = myuser
    hibernate.connection.password = secret
    hibernate.c3p0.min_size=5
    hibernate.c3p0.max_size=20
    hibernate.c3p0.timeout=1800
    hibernate.c3p0.max_statements=50
    hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
    

    【讨论】:

    • 您好,感谢您的回答。但是环境是否共享相同的配置是我无法控制的 :-( 系统在我加入项目时就已经设置好了,他们不愿意对其进行任何更改......生活是硬...
    • @Alvin 我一定错过了什么。实际的解决方案是否有效?我的理解是它没有(在这种情况下改变似乎是一个自然的选择)。
    • 也许我遗漏了一些东西,但是您是否尝试在一个且唯一的 ISessionFactory 下使用 Hibernate 配置?如果您需要不同的连接,那么您将需要命名 元素,以我对事物的理解,然后构建 ISessionFactory API 的两个实例。一个用于 JNDI,另一个用于 JDBC。像这样命名每个 元素对我来说似乎是合理的。你们俩怎么看?实际上,如果 JNDI 和 JDBC 数据库彼此不同,这需要您有不同的映射程序集。
    • @Will 我没有将问题理解为“我需要将我的应用程序连接到两个数据库”而是“我的应用程序部署在两个环境中并且需要不同的数据库配置参数。顺便说一句,这是Java :)
    • @Alvin 老实说,我不知道如果您同时提供两种配置,Hibernate 会表现如何。如果 JNDI 查找失败(我不知道在 JDNI 环境中会发生什么),它可能会依赖 JDBC 的东西。但我从未测试过这个。其实,我理解你的立场和决策者的观点。但是,当环境相似时,通用配置才有意义。如果不是,那么配置就是……配置的重点。
    【解决方案2】:

    在配置文件中使用 URL 方法。在代码中,手动尝试使用 context.lookup("java:comp/env/...") 连接到 JNDI 源。如果成功,请设置 Hibernate 数据源属性并取消设置与 url 相关的属性。如果失败,让 Hibnerate 继续配置 url。

    if (jndiDataSourceExists()) {
      configuration.setProperty(Environment.DATASOURCE, "jdbc/jndiname")
      configuration.setProperty(Environment.URL, null);
    }
    configuration.buildSessionFactory();
    

    【讨论】:

      猜你喜欢
      • 2011-07-15
      • 2022-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多