why does the javax.naming.NamingException occur here?
java, jdbc, naming
Solution
The stacktrace hints that you're using Glassfish. Remove the `java:comp/env/` part. It's the default JNDI context root already. Only in Tomcat you need to specify it explicitly. Also, you should be invoking this in webapp context, not as a plain Java Application with `main()`.
Unrelated to the concrete problem, do you really need to get the `DataSource` everytime? I'd create a helper class which obtains it only once on webapp's startup or in a static initializer. It's application wide and threadsafe. Only the `Connection` indeed needs to be obtained (and closed! you're not closing it, so you're leaking DB resources) everytime you need to fire a SQL query.
Problem
when i run the following : ``` package NonServletFiles; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import javax.sql.DataSource; import javax.naming.*; public class GetTagsFromDatabase { public GetTagsFromDatabase() { } public String[] getTags() { String tags[] = null; try { Context context = new InitialContext(); DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/photog"); // <<----- line 23 Connection connection = ds.getConnection(); String sqlQuery = "select NAMEOFTHETAG from tagcollection"; PreparedStatement statement = connection.prepareStatement(sqlQuery); ResultSet set = statement.executeQuery(); int i = 0; while(set.next()) { tags[i] = set.getString("NameOfTheTag"); System.out.println(tags[i]); i++; } }catch(Exception exc) { exc.printStackTrace(); } return tags; } public static void main(String args[]) { new GetTagsFromDatabase().getTags(); // <<----- line 43 } } ``` I get the following exceptions : ``` javax.naming.NamingException: Lookup failed for 'java:comp/env/jdbc/photog' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NamingException: Invocation exception: Got null ComponentInvocation ] at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:518) at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455) at javax.naming.InitialContext.lookup(InitialContext.java:411) at NonServletFiles.GetTagsFromDatabase.getTags(GetTagsFromDatabase.java:23) at NonServletFiles.GetTagsFromDatabase.main(GetTagsFromDatabase.java:43) Caused by: javax.naming.NamingException: Invocation exception: Got null ComponentInvocation at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.getComponentId(GlassfishNamingManagerImpl.java:873) at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:742) at com.sun.enterprise.naming.impl.JavaURLContext.lookup(JavaURLContext.java:172) at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:498) ... 4 more ``` I don't know the reason for this exception,all other servlets that need to connect to the database with the url `java:comp/env/jdbc/photog` work fine.