Java 启动时加载属性的servlets init方法中的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

我有一个Servlet,它在servletsinit方法中初始化其数据源(因为它是第一次在那里访问的)。在加载servlet时,我会收到以下异常消息

无法为连接URL“null”创建类“”的JDBC驱动程序

但是当处理第一个请求时,jndi查找工作正常,数据源初始化正确

以下是我的数据源类:

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)method?您使用的是什么应用服务器?servlet的代码会有所帮助。@MaVRoSCy Apache Tomcat 6.0。18@Abu没有。但我现在就试过了。问题仍然存在。没有。同样的结果。但无论如何,谢谢。您认为问题出在哪里?您在哪里定义了DB凭据。我已在context.xml文件中定义。凭据在context.xml中定义。我不认为这是一个凭据问题,因为它在处理第一个请求后工作正常……查找错误无法为connecturl“null”创建类为“”的JDBC驱动程序。当它实例化数据源时,上下文没有初始化。由于代码位于静态块中,因此它可能在初始化上下文之前执行。所以,为了进行测试,您可以将特定代码转移到静态方法checkOut()而不是静态块。我认为您在上下文初始化方面是正确的,但我不明白为什么会发生这种情况。一旦调用init,它就应该由容器初始化!?