Chemin JNDI Tomcat vs Jboss

J’ai DataSource qui est configuré sur Tomcat 6 dans context.xml comme MyDataSource. Et je vais le chercher de la manière suivante:

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); } 

Tout fonctionne bien. J’exporte maintenant ce code vers Jboss AP 6. J’ai configuré mon source de données et son pool de connexions en tant que source de données local-tx sous le même nom.

Lorsque j’exécute le code ci-dessus, j’obtiens une exception NamingException. après une enquête, j’ai trouvé que la bonne façon d’appeler mon DataSource sous Jboss est

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

Quelqu’un peut-il m’expliquer pourquoi je devrais omettre “comp / env” dans mon chemin JNDI sous Jboss?

L’approche portable pour définir les sources de données consiste à utiliser une référence de ressource . Les références de ressources vous permettent de définir le nom JNDI de votre source de données, par rapport au contexte de nommage de votre application ( java:comp/env ), puis de mapper cette référence logique à la ressource physique définie dans le serveur d’applications, dont le nom JNDI est propriétaire. le fournisseur du serveur d’applications. Cette approche permet à votre code et à votre assemblage d’être portables vers tout serveur d’applications conforme.

Étape 1: Déclarer et rechercher une référence de ressource

Option 1

Cela peut être fait en déclarant une resource-ref dans votre descripteur de déploiement Web ( WEB-INF/web.xml ):

  My Data Source. jdbc/MyDataSource javax.sql.DataSource Container  

Dans votre code, vous pouvez ensuite rechercher cette ressource à l’aide du nom JNDI java:comp/env/jdbc/MyDataSource :

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

Ce nom JNDI ne changera pas, quel que soit le serveur sur lequel l’application est déployée.

Option 2

Alternativement, à partir de Java EE 5 (Servlet 2.5), cela peut être fait encore plus facilement dans votre code en utilisant l’annotation @Resource . Cela élimine le besoin de configurer la référence de ressource dans votre descripteur de déploiement Web (web.xml) et évite la nécessité d’effectuer une recherche JNDI explicite:

 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 } 

Cette approche a les mêmes résultats que l’option précédente, mais réduit le code et la configuration standard de votre assemblage.

Étape 2: mapper la référence de la ressource à la source de données

Ensuite, vous devrez utiliser l’approche exclusive de votre serveur d’applications pour mapper la référence de ressource à la source de données physique que vous avez créée sur le serveur, par exemple à l’aide des descripteurs de déploiement personnalisés de JBoss ( WEB-INF/jboss-web.xml ):

    jdbc/MyDataSource javax.sql.DataSource java:/MyDataSource   

Ou, par exemple, en utilisant le context.xml de Tomcat:

  

Vous pouvez append à la définition de votre source de données la balise ‘jndi-name’:

jndi-name – nom JNDI sous lequel le DataSource doit être lié.

Vous pouvez trouver la documentation sur les sources de données sur le wiki JBoss: ConfigDataSources