NameNotFoundException for ctx.lookup("jdbc/SPECjOrderDS")
willreichert Dec 22, 2011 10:46 PMI am working with the SPECjEnterprise benchmarking application on JBoss as 7.1.0.CR1-SNAPSHOT and have encountered a strange behaviour with the JNDI lookup. The SPEC application is experiencing the following exception when trying to lookup the datasource.
22:33:38,653 FINE [org.spec.jent.loader.DatabaseHelper] (http-localhost.localdomain-127.0.0.1-8080-6) Lookup of data source jdbc/SPECjOrderDS for loading SPECjEnterprise database failed.: javax.naming.NameNotFoundException: jdbc/SPECjOrderDS -- service jboss.naming.context.java.jdbc.SPECjOrderDS at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:92) at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:177) at org.jboss.as.naming.InitialContext.lookup(InitialContext.java:87) at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:213) at javax.naming.InitialContext.lookup(InitialContext.java:411) [:1.7.0_b147-icedtea] at org.spec.jent.loader.DatabaseHelper.getConnection(DatabaseHelper.java:63) [specj.jar:] at org.spec.jent.loader.Load.getConnection(Load.java:133) [specj.jar:] at org.spec.jent.loader.Load.getConnection(Load.java:122) [specj.jar:] at org.spec.jent.loader.Load.loadSequence(Load.java:163) [specj.jar:] at org.spec.jent.loader.LoadOrders.loadSequences(LoadOrders.java:124) [specj.jar:] at org.spec.jent.loader.LoadTracker.start(LoadTracker.java:52) [specj.jar:] at org.spec.jent.loader.LoaderServlet.doGet(LoaderServlet.java:121) [classes:] at javax.servlet.http.HttpServlet.service(HttpServlet.java:734) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:] at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.6.Final.jar:] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.6.Final.jar:] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.6.Final.jar:] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.6.Final.jar:] at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.1.0.CR1-SNAPSHOT.jar:] at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:151) [jboss-as-web-7.1.0.CR1-SNAPSHOT.jar:] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.6.Final.jar:] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.6.Final.jar:] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.6.Final.jar:] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:362) [jbossweb-7.0.6.Final.jar:] at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:897) [jbossweb-7.0.6.Final.jar:] at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:626) [jbossweb-7.0.6.Final.jar:] at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:2033) [jbossweb-7.0.6.Final.jar:] at java.lang.Thread.run(Thread.java:722) [:1.7.0_b147-icedtea]
From my understanding this means the code is calling ctx.lookup("jdbc/SPECjOrderDS") but the call is going to java:jdbc/SPECjOrderDS instead of java:comp/env/jdbc/SPECjOrderDS. The DatabaseHelper class is in specj.jar however the LoaderServlet is in specj.war. The application is deployed as spec.ear with with the following content.
jar -tf specj.ear META-INF/ META-INF/application.xml META-INF/MANIFEST.MF specj.war supplier.war specj.jar lib/ lib/generated-ws-buyer.jar
specj.war's web.xml has the following resource references
<resource-ref> <res-ref-name>jdbc/SPECjOrderDS</res-ref-name> <jndi-name>java:jboss/jdbc/SPECjOrderDS</jndi-name> </resource-ref> <resource-ref> <res-ref-name>java:jdbc/SPECjOrderDS</res-ref-name> <jndi-name>java:jboss/jdbc/SPECjOrderDS</jndi-name> </resource-ref>
I realize the ideal situation would be to just change the code to call lookup("java:jboss/jdbc/SPECjOrderDS") however it would be better and easier to find a solution that focuses on configuration changes.
I also thought all calls to lookup() from a Servlet but without a fully qualified context default to java:comp/env, is that incorrect?
Thanks to everyone who can take a look and help me better understand the situation.