为什么javax.naming.NamingException出现在这里?
发布时间:2020-12-15 00:45:34 所属栏目:Java 来源:网络整理
导读:当我运行以下内容: 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 GetTagsFromDatabas
当我运行以下内容:
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 } } 我得到以下例外情况: 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 我不知道这个异常的原因,所有其他需要使用url java:comp / env / jdbc / photog连接到数据库的servlet工作正常. 解决方法
stacktrace暗示您正在使用Glassfish.删除java:comp / env / part.它已经是默认的JNDI上下文根.仅在Tomcat中,您需要明确指定它.此外,您应该在webapp上下文中调用它,而不是使用main()作为普通Java应用程序.
与具体问题无关,你真的需要每次都获得DataSource吗?我创建了一个帮助程序类,它只在webapp的启动或静态初始化程序中获取一次.它的应用范围广,线程安全.每次需要触发SQL查询时,确实只需要获取连接(并且关闭!您没有关闭它,因此您正在泄漏数据库资源). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |