gpt4 book ai didi

java - 为什么这里会出现 javax.naming.NamingException?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:12:21 26 4
gpt4 key购买 nike

当我运行以下命令时:

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 工作正常。

最佳答案

堆栈跟踪提示您正在使用 Glassfish。删除 java:comp/env/ 部分。它已经是默认的 JNDI 上下文根。只有在 Tomcat 中您需要明确指定它。此外,您应该在 webapp 上下文中调用它,而不是作为带有 main() 的普通 Java 应用程序。


与具体问题无关,您真的需要获取 DataSource 每次吗?我会创建一个助手类,它只在 webapp 启动时或在静态初始化程序中获取一次。它是应用程序范围和线程安全的。每次需要触发 SQL 查询时,确实只需要获取Connection(并关闭!您没有关闭它,所以您正在泄漏 DB 资源)。

关于java - 为什么这里会出现 javax.naming.NamingException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10369867/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com