Java 启动时加载属性的servlets init方法中的JNDI查找
我有一个Servlet,它在servletsinit方法中初始化其数据源(因为它是第一次在那里访问的)。在加载servlet时,我会收到以下异常消息 无法为连接URL“null”创建类“”的JDBC驱动程序 但是当处理第一个请求时,jndi查找工作正常,数据源初始化正确 以下是我的数据源类:Java 启动时加载属性的servlets init方法中的JNDI查找,java,servlets,datasource,jndi,Java,Servlets,Datasource,Jndi,我有一个Servlet,它在servletsinit方法中初始化其数据源(因为它是第一次在那里访问的)。在加载servlet时,我会收到以下异常消息 无法为连接URL“null”创建类“”的JDBC驱动程序 但是当处理第一个请求时,jndi查找工作正常,数据源初始化正确 以下是我的数据源类: public class PostgresDataSource{ private static DataSource dataSource; static { try { da
public class PostgresDataSource{
private static DataSource dataSource;
static {
try {
dataSource = (DataSource) new InitialContext().lookup("java:/comp/env/jdbc/somedb");
} catch (NamingException e) {
Log.logger.fatal("Failed to initialize DB!");
Log.logger.error(e.getMessage());
e.printStackTrace();
}
}
public static Connection checkOut(){
if ( dataSource != null )
{
try {
return dataSource.getConnection();
} catch (SQLException e) {
Log.logger.error("Failed to establish DB connection!");
Log.logger.error(e.getMessage());
e.printStackTrace();
return null;
}
}
else
{
Log.logger.error("Failed to check out DB-Connection: Postgres DataSource not initialized!");
return null;
}
}
public static void checkIn( Connection dbcon){
if ( dataSource != null )
{
try {
dbcon.close();
} catch (SQLException e) {
Log.logger.error("Failed to close DB connection!");
e.printStackTrace();
}
}
else
{
Log.logger.error("Cannot check in DB-Connection: Postgres DataSource not initialized!");
}
}
}
有人遇到过同样的问题吗?这是什么原因?如何解决它?而不是使用
dataSource=(dataSource)new InitialContext().lookup(“java:/comp/env/jdbc/somedb”)
请使用以下方法,这可能会解决问题
InitialContext context = new InitialContext();
Context envCtx = (Context) context.lookup("java:comp/env");
dataSource = (DataSource) envCtx.lookup("jdbc/somedb");
您是否调用了
super.init(config)如果您使用的是参数化的init方法,请在servlet的init中使用code>method?您使用的是什么应用服务器?servlet的代码会有所帮助。@MaVRoSCy Apache Tomcat 6.0。18@Abu没有。但我现在就试过了。问题仍然存在。没有。同样的结果。但无论如何,谢谢。您认为问题出在哪里?您在哪里定义了DB凭据。我已在context.xml文件中定义。凭据在context.xml中定义。我不认为这是一个凭据问题,因为它在处理第一个请求后工作正常……查找错误无法为connecturl“null”创建类为“”的JDBC驱动程序。当它实例化数据源时,上下文没有初始化。由于代码位于静态块中,因此它可能在初始化上下文之前执行。所以,为了进行测试,您可以将特定代码转移到静态方法checkOut()而不是静态块。我认为您在上下文初始化方面是正确的,但我不明白为什么会发生这种情况。一旦调用init,它就应该由容器初始化!?