使用属性load-on-startup在servlet init方法中进行JNDI查找

时间:2013-06-26 12:51:22

标签: java servlets datasource jndi

我有一个Servlet,它在Servlets init方法中初始化它的DataSource(因为它是第一次访问它)。当servlet被加载时,我得到以下异常消息

  

无法创建类''的JDBC驱动程序用于连接网址' null'

但是当处理第一个请求时,jndi查找工作正常并且DataSource已正确初始化。

这是我的DataSource类:

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!");
    }
}
}

有人遇到过同样的问题吗?这是什么原因以及如何解决?

1 个答案:

答案 0 :(得分:1)

而不是使用 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");