JNDI Path Tomcat vs. Jboss

Mam DataSource, który jest skonfigurowany na Tomcat 6 w kontekście.xml jako MyDataSource. I pobieram to w następujący sposób:

      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);
            }
Wszystko działa dobrze. Teraz eksportuję ten kod do Jboss AP 6. i skonfigurowałem moje źródło danych i jego pulę połączeń jako local - TX dataSource pod tą samą nazwą.

Kiedy wykonuję powyższy kod, otrzymuję wyjątek NamingException. po pewnym śledztwie odkryłem, że poprawnym sposobem na wywołanie mojego źródła danych pod Jboss jest

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

Czy ktoś może mi wyjaśnić dlaczego mam pomijać "comp / env" w ścieżce JNDI pod Jboss?

Author: CoolBeans, 2011-08-29

2 answers

Przenośne podejście do definiowania źródeł danych polega na użyciu odniesienie do zasobów. Odniesienia do zasobów umożliwiają zdefiniowanie nazwy JNDI dla źródła danych w stosunku do kontekstu nazw aplikacji (java:comp/env), a następnie mapowanie tego logicznego odniesienia do fizycznego zasobuzdefiniowanego na serwerze aplikacji, którego nazwa JNDI jest zastrzeżona do dostawcy serwera aplikacji. Takie podejście umożliwia przenośność kodu i złożenia do dowolnego zgodnego serwera aplikacji.

Krok 1: Declare and Lookup Resource Reference

Opcja 1

Można to zrobić, deklarując resource-ref w deskryptorze wdrożenia sieci web(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>

W kodzie możesz wyszukać ten zasób używając nazwy JNDI java:comp/env/jdbc/MyDataSource:

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

Nazwa JNDI nie ulegnie zmianie niezależnie od serwera, na którym wdrożona jest aplikacja.

Opcja 2

Alternatywnie, począwszy od Java EE 5 (Servlet 2.5), można to zrobić jeszcze łatwiej w kodzie za pomocą @Resource adnotacja. Eliminuje to konieczność konfigurowania resource-ref w deskryptorze wdrażania sieci web (web.xml) i zapobiega konieczności wykonywania jawnego wyszukiwania 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

}

To podejście ma takie same wyniki jak poprzednia opcja, ale ogranicza kod kotła i konfigurację w Twoim złożeniu.

Krok 2: odniesienie do zasobów mapy do źródła danych

Wtedy, ty będzie musiał użyć własnego podejścia serwera aplikacji do mapowania odniesienia do zasobów fizycznego źródła danych , które utworzyłeś na serwerze, na przykład przy użyciu niestandardowych deskryptorów wdrażania 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>

Lub, na przykład, za pomocą Tomcat ' s context.xml:

<Resource name="jdbc/MyDataSource" . . . />
 25
Author: shelley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-06 17:28:08

Możesz dodać do definicji źródła danych tag 'JNDI-name':

JNDI-Nazwa-Nazwa JNDI, pod którą powinno być powiązane źródło danych.

Możesz znaleźć dokumentację źródła danych na JBoss wiki: ConfigDataSources

 1
Author: Lukasz Stelmach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-29 07:00:06