我们有2个不同的服务器环境使用相同的Hibernate配置。一台服务器对数据源有JNDI支持,但另一台服务器没有。目前,Hibernate配置配置为使用JNDI,这会导致不支持JNDI的服务器出现问题。
我还尝试将直接JDBC配置与JNDI配置放在配置文件中,但看起来hibernate总是倾向于JNDI而不是直接JDBC配置(如果两者都存在)。
我的问题是,如果JNDI和connection_provider配置都存在,它会一样吗? Hibernate还会在connection_provider上使用JNDI吗?或者有什么方法可以更改数据库连接属性的优先级吗?
我无法一直访问服务器,所以我想我在服务器时间窗口之前就问了这个问题。
提前致谢。
答案 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();