Hibernate数据库连接配置

时间:2010-03-11 00:00:22

标签: java hibernate orm jdbc

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

我还尝试将直接JDBC配置与JNDI配置放在配置文件中,但看起来hibernate总是倾向于JNDI而不是直接JDBC配置(如果两者都存在)。

我的问题是,如果JNDI和connection_provider配置都存在,它会一样吗? Hibernate还会在connection_provider上使用JNDI吗?或者有什么方法可以更改数据库连接属性的优先级吗?

我无法一直访问服务器,所以我想我在服务器时间窗口之前就问了这个问题。

提前致谢。

2 个答案:

答案 0 :(得分:1)

  

我们有两种不同的服务器环境使用相同的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

答案 1 :(得分:1)

在配置文件中使用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();