2010-03-11 8 views
1

У нас есть две разные серверные среды, использующие ту же конфигурацию спящего режима. Один сервер поддерживает JNDI для источника данных, а другой - нет. В настоящее время конфигурация Hibernate настроена на использование JNDI, что вызывает проблемы на сервере, который не поддерживает JNDI.Конфигурация подключения базы данных Hibernate

Я также попытался поместить прямую конфигурацию JDBC вместе с конфигурацией JNDI в файл конфигурации, но похоже, что hibernate всегда поддерживает JNDI по прямой конфигурации JDBC, если они существуют.

Мой вопрос в том, будет ли он одинаковым, если обе конфигурации JNDI и connection_provider существуют? Будет ли Hibernate по-прежнему использовать JNDI через connection_provider? Или есть ли способ изменить приоритет свойства подключения к базе данных?

У меня нет доступа к серверу все время, поэтому я думал, что задаю вопрос перед моим окном времени.

Заранее спасибо.

ответ

1

У нас есть две разные серверные среды, использующие ту же конфигурацию спящего режима.

Ну, это может быть не ожидаемый ответ, но у меня возникает ощущение, что вы сами создаете проблему: если ваша среда отличается от другой, используйте разные конфигурации. Что я бы сделать следующее:

  • расставит все общее в hibernate.cfg.xml (комплектного в приложении)
  • ставить конкретные вещи в hibernate.properties файлы и поместить «правильный» в корневом каталоге класса путь для каждого приложения (но за пределами приложение).

Например, это было бы содержание hibernate.properties для «JNDI среды»:

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 

И это было бы содержание hibernate.properties для «не среды JNDI»:

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 
+0

привет спасибо за ваш ответ. Но независимо от того, работает ли среда с такой же конфигурацией или нет, это не под моим контролем :-(Система настроена так же, как к моменту присоединения к проекту, и они не хотят делать никаких изменений в этом ... жизнь hard ... – Alvin

+0

@Alvin Мне что-то не хватает. Работает ли реальное решение или нет? Я понимаю, что это не так (в этом случае изменение кажется естественным выбором). –

+0

Возможно, мне что-то не хватает, но вы пытаетесь использовать конфигурацию Hibernate под одним и только ISessionFactory? Если вам требуется отдельное соединение, тогда вам нужно будет иметь имена элементов , в моем понимании вещи, а затем создать два экземпляра API ISessionFactory. Один для JNDI и другой для JDBC. Именование каждого элементов, подобных мне, кажется мне разумным. Что вы оба думаете об этом?В самом деле, это требует, чтобы у вас были разные сборки сопоставления, если базы данных JNDI и JDBC отличаются друг от друга. –

1

Используйте метод URL в файле конфигурации. В коде вручную попробуйте подключиться к источнику JNDI с помощью context.lookup («java: comp/env/...»). Если это удастся, установите свойство источника данных Hibernate и отключите свойства, связанные с URL. Если это не удается, Hibnerate продолжит настройку URL-адреса.

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