2010-09-20 3 views
4

Предисловие:
Большинство приложений J2EE используют управляемые контейнерами источники данных через JNDI. Это нормально, поскольку он дает одно место для настройки этих соединений.
Проблема возникает, когда мы хотим использовать инфраструктуру ORM (например, спящий режим) или что-то, что должно знать схему по умолчанию (в основном для Oracle, могут быть и другие), которые могут отличаться от имени пользователя, которое используется для подключения к DB.Пользовательский ресурс в JNDI на разных серверах приложений

Я хочу поместить имя схемы по умолчанию где-то рядом с определением источника данных. Одним из вариантов было бы поместить его в JNDI. Затем я буду вручную читать оттуда до построения EntityManager (ну, фактически, используя Spring).

Как я выяснил, есть простой способ определить пользовательский ресурс (в этом случае это будет строка с именем схемы по умолчанию) в Apache Tomcat, как это (поправьте меня, если я ошибаюсь):

<Environment name="schemaNames/EmployeeDB" 
      type="java.lang.String" 
      value="empl" 
     description="Schema name of Employees Database for HR Applications"/> 

во всяком случае, учитывая это может быть сделано в Apache Tomcat, как я должен настроить один и тот же пользовательский JNDI ресурс (типа String) в рамках других серверов приложений:

  • JBoss 4/5
  • WebSphere 6/7
  • WebLogic 9/10

Если вы знаете о других серверах, это было бы здорово.

Кроме того, в качестве альтернативы я не хочу указывать имя схемы в системных свойствах или переменных среды.

спасибо!


Обновление:
нашел способ ее достижения на JBoss. Я не тестировал это.
http://forums.java.net/jive/thread.jspa?messageID=316228

Найдена информация для WebLogic, но они говорят о выполнении этого programmaticly, а не с конфигурацией:
http://weblogic-wonders.com/weblogic/2010/06/12/binding-objects-in-weblogic-servers-jndi-tree/
http://forums.oracle.com/forums/thread.jspa?messageID=4397353

+1

Почему вы не хотите использовать переменные среды ('env-entry')? – ewernli

+0

Это именно то, что я пытаюсь сделать, но без редактирования web.xml приложения. –

ответ

5

Для WebSphere вы можете задать схему по умолчанию в вашем определенном DataSource. Это настраиваемое свойство currentSchema. (т. е. в V7 это Ресурсы> JDBC> Источники данных> ваше имя источника данных> Пользовательские свойства> currentSchema.

В противном случае вы можете использовать связывание с пространством имен и определить его там: (т.е. в V7 это среда> Нейминг> Пространство имен привязок. вы можете использовать JNDI, чтобы посмотреть это, если вы не хотите, чтобы программно установить его в WebSphere.

не могу говорить с JBoss и WebLogic, как я не работал с ними.

2

В JBoss вы можете использовать специальный MBean (org.jboss.naming.JNDIBindingServiceMgr) и service.xml для настройки записей JNDI, а затем сопоставить эти записи в своих веб-папках.Существует длинная экспликации для этого достаточно нетривиального процесса здесь:

http://usna86-techbits.blogspot.com/2011/01/jboss-jndi-and-javacompenv.html

Я все еще ищу аа способ разместить целые свойства-файл/ResourceBundle в JNDI, так как это ручное отображение становится очень утомительным когда у вас есть много свойств, которые вы хотите поместить в jndi, и сделайте доступными для своих веб-приложений.

2

Эта же проблема довольно долгое время беспокоилась о WebLogic, в частности 10.3.5 (11g).

Я провел большую часть дня, оглядываясь по сторонам, и все, что я нашел, было следующим: http://code.google.com/p/weblogic-jndi-startup/. Он работает отлично. Это немного ограничительный: для этого требуется объект, который вы хотите добавить в JNDI, чтобы иметь конструктор с одним параметром String.

Для чего мне нужно, weblogic-jndi-startup не работал, поэтому я построил код Роджера и придумал это: https://bitbucket.org/phillip_green_idmworks/weblogic-jndi-custom-resource-configuration/. У меня есть запись для него в http://coder-in-training.blogspot.com/2012/03/weblogic-jndi-custom-resource.html

3

Если вы используете спящий режим, это свойство, чтобы добавить в блоке сохранения:

<property name="hibernate.default_schema" value="myschema" /> 

Это префикс, который JPA вставит для имен таблиц.

Если вам нужно что-то «ближе» к определениям AS Datasources, вы можете добавить некоторый DB-специфический SQL на время соединения DB; например, Oracle,

ALTER SESSION SET CURRENT_SCHEMA =

На JBoss, вы можете добавить это в определении источника данных:

<new-connection-sql> 
ALTER SESSION SET CURRENT_SCHEMA=myschema 
</new-connection-sql> 

Рекомендуем также редактируемые в JBoss 7 Admin.

В Weblogic вы можете ввести это в пулы соединений.

На Websphere это должно быть похоже.

Смежные вопросы