Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > resource-ref (jdbc), для чего он?


Автор: WatchCat 9.12.2006, 16:56
Вот есть в web.xml такой тэг как resource-ref.
Например
Код

  <resource-ref>
    <description>
      Resource reference to JNDI factory for the JDBCUserDatabase.
    </description>
  <res-ref-name>jdbc/UserDatabase</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
  </resource-ref>

вот хочю понять, зачем он применяется для описания jdbc ресурса? smile 
Есть же <datasources> и к такому ресурсу можно нормально обратиться через 
Код

DataSource ds = (DataSource) context.lookup("java:/jdbc/UserDatabase");

и для этого совсем необязательно описывать в web.xml resource-ref.

Автор: tux 9.12.2006, 17:26
В resource-ref описывается, так сказать, логическое имя источника JDBC (у тебя jdbc/UserDatabase), которое указывает на физическое имя (java:/jdbc/UserDatabase). Если использовать в приложение логическое имя-ссылку, то можно как угодно менять источник данных, при этом с самом приложении не изменится ничего. Других причин использования resource-ref нет.

Автор: WatchCat 10.12.2006, 15:30
Цитата(tux @  9.12.2006,  17:26 Найти цитируемый пост)
resource-ref описывается, так сказать, логическое имя источника JDBC

Довольно таки путано, тк <datasources> тоже описывает JNDI ссылку на ресурс, которая сама по себе логическая.
Но немного покапавшись я понял  smile 
<resource-ref> позволяет описать JDBC ресурс в дескрипторе приложения, тогда как <datasources> это у контейнера.
Вроде так, если я чегото не напутал.

Автор: tux 10.12.2006, 15:46
Цитата(WatchCat @  10.12.2006,  15:30 Найти цитируемый пост)
<resource-ref> позволяет описать JDBC ресурс в дескрипторе приложения, тогда как <datasources> это у контейнера.

Тоже запутано. smile Все конечно так, но!!! Имя в resource-ref - это не имя реального ресурса (соединения с БД в данном случае), а лишь ссылка на имя того ресурса, который описан в контейнере. То есть когда ты обращаешься по имени в resource-ref, контейнер находит на какое имя надо сослаться и на самом деле обращается к тому ресурсу, который определен в контейнере. Это и позволяет изменять источник данных не меняя ничего в приложении. Ассоциация между именами в <datasources> и <resource-ref> описывается в jboss-web.xml, вот этот файл при замене источника и изменится, больше ничего.

Логические и физические имена - это моя собственная терминология, звиняюсь, что запутал. smile

Автор: WatchCat 10.12.2006, 16:11
Вот в том и дело, что есть JNDI имя JDBC ресурса, так на него и ещё одна ссылка.

Вот только нафига делать  smile  видно это вопрос философский   smile 

Автор: tux 10.12.2006, 16:23
Цитата(WatchCat @  10.12.2006,  16:11 Найти цитируемый пост)
Вот в том и дело, что есть JNDI имя JDBC ресурса, так на него и ещё одна ссылка.

Ну вот обращаешься ты к источнику данных из приложения. Естественно, тебе нужно внутри приложения хранить имя этого ресурса. Потом приложение начали разворачивать на сервере у заказчика. Там имя источника совсем другое. Тогда надо соответствующим образом менять это имя в приложении везде, где оно используется. А в реально большом приложении оно может упоминаться кучу раз. И не всегда потому что приложение плохо спроектировано. Понятно, что сделать это не так сложно, но все же удобнее использовать такие ссылки и поменять имя в одном месте.

Цитата(WatchCat @  10.12.2006,  16:11 Найти цитируемый пост)
видно это вопрос философский

Вопрос философский, конечно. Использовать ссылки или не использовать - дело индивидуальное. smile

Автор: WatchCat 10.12.2006, 17:04
Цитата(tux @  10.12.2006,  16:23 Найти цитируемый пост)
Тогда надо соответствующим образом менять это имя в приложении везде, где оно используется.

Совсем необязательно.
Можно создать новый датасурс с необходимым JNDI именем, для JBoss'а достаточно в деплое создать файлик с описанием необходимого DS'а, контейнер-то может предоставлять множество датасурсов.
Глано имя при разработке выбрать не DefaultDS smile

просто я предпочитаю цепочку в 3 звена:
СУБД <> datasource <> application
а этот ресурс-реф добавляет ещё одно звено и всё.
СУБД <> datasource <> resource-ref <> application
Ну вобщем дело вкуса.

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

Автор: tux 10.12.2006, 17:35
Цитата(WatchCat @  10.12.2006,  17:04 Найти цитируемый пост)
Можно создать новый датасурс с необходимым JNDI именем

Это можно у себя на машине, у заказчика совсем не факт. В общем resource-ref дает иногда кой-какие удобства.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)