javax.naming.NameNotFoundException:名称[comp / env]未绑定在此Context中。无法在Tomcat中找到[comp]

时间:2013-04-03 14:34:07

标签: java tomcat7 postgresql-9.2

我在Windows环境下的本地计算机上将代码部署在Tomcat 6.0.32中。并且在Linux环境中的远程机器上将相同的WAR文件部署在Tomcat 7.0.39中。

context.xml的代码如下:

<?xml version="1.0" encoding="UTF-8"?>
    <Context antiJARLocking="true" path="/CentralizedPush">
        <Resource auth="Container" driverClassName="org.postgresql.Driver" maxActive="20" maxIdle="10" maxWait="-1" name="jdbc/postgres" password="commonpush12#" type="javax.sql.DataSource" url="jdbc:postgresql://10.40.5.59:5444/commonpush_database" username="commonpush"/>
    </Context>

DBConnection.java的代码如下:

import java.sql.Connection;
import java.sql.Driver;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import org.slf4j.LoggerFactory;  


public class DBConnection {
    private static Connection con = null;

/**function is used for creating connection
 * @return Connection object
 */
public static Connection getConnection() {
    org.slf4j.Logger LOG = LoggerFactory.getLogger("Error");

    try {
        Driver d = (Driver) Class.forName(Constant.CLASS_NAME).newInstance();
        Context initContext = new InitialContext();
        Context envContext = (Context) initContext.lookup("java:comp/env");
        DataSource ds = (DataSource) envContext.lookup("jdbc/postgres");

        con = ds.getConnection();

    } catch (ClassNotFoundException ex) {
        ex.printStackTrace();
        LOG.error("ClassNotFoundException" );
    } catch (InstantiationException ex) {
        ex.printStackTrace();
        LOG.error("InstantiationException" );
    } catch (IllegalAccessException ex) {
        ex.printStackTrace();
        LOG.error("IllegalAccessException" );
    } catch (NamingException ex) {
        ex.printStackTrace();
        LOG.error("NamingException" );
    } catch (SQLException ex) {
        ex.printStackTrace();
        LOG.error("SQLException in db connection" );
    }

    return con;
}

我在postgres中有我想要访问的数据库,其详细信息如下:

Name: CDCUCOMPUDB
Host: 10.40.5.59
Port: 5444
database name: commonpush_database

问题是当我在本地计算机上部署代码时一切都很好,但是当我在Linux环境中的远程服务器上部署代码并且具有不同的Tomcat版本时,我得到以下错误:

javax.naming.NameNotFoundException: Name [comp/env] is not bound in this Context. Unable to find [comp].

请提出任何解决方案。

2 个答案:

答案 0 :(得分:1)

在“java:comp / env / jdbc / postgres”的单个查找中执行此操作。这里没有理由使用两个上下文。

答案 1 :(得分:0)

我遇到了同样的错误。我试图按照Tomcat DataSource JNDI Example for Servlet Web Application指令创建一个全局jdbc连接池。在他的示例代码中,他使用“java:/ comp /”来查找,而不是“java:comp /”。这是有问题的。否则,这是一个非常有用的指南。