Möchte man, dass eine Java-Webanwendungen auf verschiedenen Applicationservern oder Servletcontainern lauffähig ist, gibt es im Bezug auf JNDI einen kleinen Fallstrick. Die JNDI-Namen für Resourcen sind nämlich nicht überall gleich. Mit folgendem Code kann man unter Glassfish auf einen vom Applicationserver zur Verfügung gestellten Connection-Pool zugreifen:
InitialContext context = new InitialContext();
DataSource dataSource = (DataSource) context.lookup("jdbc/mydb");
Connection connection = dataSource.getConnection();
Mit anderen Servern, wie z.B. Apache Tomcat, funktioniert dies jedoch nicht. Statt dem String "jdbc/mydb"
müsste man dort "java:comp/env/jdbc/mydb"
verwenden. Das wiederum funktioniert nicht mit Glassfish, zumindestens nicht ohne weiteres. Allerdings gibt es dafür eine Lösung.
Man verwendet folgenden Java-Code.
DataSource dataSource = (DataSource) context.lookup("java:comp/env/jdbc/mydb");
Dazu muss man dann noch den Standard Deployment Descriptor web.xml und die glassfish-web.xml anpassen. In die web.xml wird folgendes eingefügt:
<resource-ref>
<res-ref-name>jdbc/mydb</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
und in die glassfish-web.xml das:
<resource-ref>
<res-ref-name>jdbc/mydb</res-ref-name>
<jndi-name>jdbc/mydb</jndi-name>
</resource-ref>
Danach funktioniert die Webapp sowohl mit Glassfish als auch mit Tomcat, wenn im Server die nötigen JNDI-Resourcen konfiguriert sind.