Путь JNDI Tomcat против Jboss

У меня есть DataSource, который настроен на Tomcat 6 в context.xml как MyDataSource. А я получаю это следующим образом:

      DataSource dataSource;
            try {
                dataSource = (DataSource) new InitialContext().lookup("java:comp/env/MyDataSource");
            } catch (NamingException e) {
                throw new DaoConfigurationException(
                    "DataSource '" + url + "' is missing in JNDI.", e);
            }

Все нормально работает. Теперь я экспортирую этот код в Jboss AP 6. и настроил свой источник данных и его пул соединений как источник данных local-tx под тем же именем.

Когда я выполняю приведенный выше код, я получаю исключение NamingException. после некоторого расследования я обнаружил, что правильный способ вызова моего DataSource под Jboss -

 dataSource = (DataSource) new InitialContext().lookup("java:/MyDataSource");

Может ли кто-нибудь объяснить мне, почему я должен опускать "comp / env" в моем пути JNDI под Jboss?


person danny.lesnik    schedule 28.08.2011    source источник
comment
Не могли бы вы также добавить записи для ваших web.xml и jboss-web.xml?   -  person CoolBeans    schedule 29.08.2011
comment
@CoolBeans, у меня больше нет записей.   -  person danny.lesnik    schedule 29.08.2011
comment
@ denny.lesnik: Хорошо. Следующий вопрос: установлено ли для параметра <use-java-context> значение true в вашем источнике данных xml (* -ds.xml)?   -  person CoolBeans    schedule 29.08.2011


Ответы (2)


Переносимый подход к определению источников данных заключается в использовании ссылки на ресурсы. Ссылки на ресурсы позволяют вам определить имя JNDI для вашего источника данных относительно контекста именования вашего приложения (java:comp/env), а затем сопоставить эту логическую ссылку с физическим ресурсом, определенным в сервер приложений, имя JNDI которого является проприетарным поставщиком сервера приложений. Такой подход позволяет переносить ваш код и сборку на любой совместимый сервер приложений.

Шаг 1. Объявление и поиск ссылки на ресурсы

Опция 1

Это можно сделать, объявив resource-ref в дескрипторе веб-развертывания (WEB-INF/web.xml):

<resource-ref>
    <description>My Data Source.</description>
    <res-ref-name>jdbc/MyDataSource</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

Затем вы можете найти этот ресурс в своем коде, используя имя JNDI java:comp/env/jdbc/MyDataSource:

dataSource = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/MyDataSource");

Это имя JNDI не изменится независимо от сервера, на котором развернуто приложение.

Вариант 2

В качестве альтернативы, начиная с Java EE 5 (Servlet 2.5), это можно сделать еще проще в вашем коде, используя _ 7_ аннотации. Это избавляет от необходимости настраивать ссылку на ресурс в дескрипторе веб-развертывания (web.xml) и предотвращает необходимость выполнять явный поиск JNDI:

public class MyServlet extends HttpServlet {

    @Resource(name = "jdbc/MyDataSource")
    private DataSource dataSource;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // dataSource may be accessed directly here since the container will automatically
        // inject an instance of the data source when the servlet is initialized

}

Этот подход дает те же результаты, что и предыдущий вариант, но сокращает шаблонный код и конфигурацию в вашей сборке.

Шаг 2. Сопоставьте ссылку на ресурс с источником данных

Затем вам нужно будет использовать собственный подход вашего сервера приложений для сопоставления ссылки на ресурс с физическим источником данных, который вы создали на сервере, например, с помощью пользовательских дескрипторов развертывания JBoss (WEB-INF/jboss-web.xml):

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
    <resource-ref>
        <res-ref-name>jdbc/MyDataSource</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <jndi-name>java:/MyDataSource</jndi-name>
    </resource-ref>
</jboss-web>

Или, например, используя Tomcat context.xml:

<Resource name="jdbc/MyDataSource" . . . />
person shelley    schedule 06.09.2011
comment
Я думаю, что <ResourceLink> - более подходящая альтернатива <resource-ref>. <Resource> просто определит новый ресурс, а не будет ссылаться на глобальный и переименовывать его. - person YoYo; 22.07.2017

Вы можете добавить в определение источника данных тег jndi-name:

jndi-name - имя JNDI, под которым должен быть привязан источник данных.

Вы можете найти документацию по источникам данных в вики JBoss: ConfigDataSources

person Lukasz Stelmach    schedule 29.08.2011