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?
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ącresource-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" . . . />
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
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