javax.naming.NameNotFoundException:名称[jdbc/rhwebDB]在此上下文中未绑定。找不到[jdbc]

javax.naming.NameNotFoundException:名称[jdbc/rhwebDB]在此上下文中未绑定。找不到[jdbc],java,tomcat,jdbc,context.xml,meta-inf,Java,Tomcat,Jdbc,Context.xml,Meta Inf,我知道有很多关于这个例外的问题,但是,我相信我已经尝试了很多天了,没有任何运气。由于这是一台生产服务器,我只能在午夜后处理:( 我有一个Tomcat应用程序。最近,我更新了连接池,以便使用Tomcat的jdbc连接池。在我的Windows开发机器中,一切都很好,但现在我正试图在Linux服务器上实现这一点,每当我的应用程序尝试连接到MySQL时,我都会遇到这个异常(请参阅标题) 我使用的是“Easy Tomcat 7”,它应该与Tomcat的常规版本相同,只是它附带了CPanel软件 我只需要此

我知道有很多关于这个例外的问题,但是,我相信我已经尝试了很多天了,没有任何运气。由于这是一台生产服务器,我只能在午夜后处理:(

我有一个Tomcat应用程序。最近,我更新了连接池,以便使用Tomcat的jdbc连接池。在我的Windows开发机器中,一切都很好,但现在我正试图在Linux服务器上实现这一点,每当我的应用程序尝试连接到MySQL时,我都会遇到这个异常(请参阅标题)

我使用的是“Easy Tomcat 7”,它应该与Tomcat的常规版本相同,只是它附带了CPanel软件

我只需要此数据库可用于此应用程序(而不是多个应用程序)

这是我的java DB类:

public class DBUtil {

static DataSource ds;
static {
    try {
        Context context = new InitialContext();
        ds = (DataSource)context.lookup("java:comp/env/jdbc/rhwebDB");
    } catch (NamingException e) {
        e.printStackTrace();
        System.out.println("DBUtil.NamingException" + e);
    } catch(Exception e) {
        System.out.println(e);
    }
}

public static Connection getConnection() throws SQLException {
    return ds.getConnection();
}
这是我的context.xml文件,位于myAppDirectory/META-INF上

<?xml version="1.0" encoding="UTF-8"?>

<Context>
<Resource
    name="jdbc/rhwebDB"
    auth="Container"
    type="javax.sql.DataSource"
    factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
    testWhileIdle="true"
    testOnBorrow="true"
    testOnReturn="false"
    validationQuery="SELECT 1"
    validationInterval="30000"
    timeBetweenEvictionRunsMillis="30000"
    maxActive="20"
    minIdle="3"
    maxIdle="15"
    maxWait="10000"
    initialSize="3"
    removeAbandonedTimeout="60"
    removeAbandoned="true"
    logAbandoned="true"
    minEvictableIdleTimeMillis="30000"
    username="dbuser"
    password="dbpwd"
    driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://127.0.0.1:3306/rhmexweb_rhweb"/>
</Context>
Tomcat似乎找不到我的META-INF/context.xml文件,或者它无法识别以下链接:

ds=(DataSource)context.lookup(“java:comp/env/jdbc/rhwebDB”)

我的linux、Tomcat和JDK版本是:

CentOS 6.8版(最终版)
ApacheTomcat/7.0.42
java版本“1.7.0_131”

我不知道我还能做什么来解决这个问题。任何帮助都将不胜感激

更新 我还没有找到解决方案。我已经意识到一些可能与所有这些相关的配置问题:

该应用程序位于以下位置:

/主页/rhmexweb/public\u html

但是,在Tomcat的server.xml文件中,此网站的主机定义为:

<Host name="rhweb.mx" appBase="webapps">
<Context path="" reloadable="false" docBase="/home/rhmexweb/public_html" />
</Host>

之所以不在webapps目录中,是因为CPanel自动在/home/account name/public_html中创建每个帐户,所以这里需要一个上下文元素(我猜)。如果我删除整个上下文标记,而是使用appBase=“/home/rhmexweb/public_html”,则Tomcat无法从WEB-INF文件夹(/home/rhmexweb/public\u html/WEB-INF)中找到所有JAR和内容只是想看看tomcat会将context.xml文件复制到哪里,如果它更改了它的名称,但结果是有两个不同的路径。首先,当我第一次包含该参数时,我遇到了一个写入权限异常,它试图在这里创建一个文件夹:

/var/lib/easy-tomcat7/webapps/

此路径仅包含默认tomcat应用程序的文件夹(管理器、示例和主机管理器)

列出所有网站和所有已编译jsp文件的文件夹如下:

org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
/usr/local/easy/etc/easy-tomcat7/Catalina/

但是,在/usr/local/easy/etc/easy-tomcat7/Catalina/rhweb.mx/中没有WEB-INF目录


无论如何,我想知道的是,为了找到appPath/META-INF/Context.xml文件,Tomcat在主机定义中是否有上下文元素可能是一个问题。

看起来
Context.xml
设置有问题。请尝试
server.xml
/META-INF/Context.xml
查看它是否有任何行为不一样

您可以尝试将配置移动到
server.xml
,如下所示:

然后在
/WEB-INF/WEB.xml
中引用它,就像您已经做的那样:

<resource-ref>
  <res-ref-name>jdbc/rhwebDB</res-ref-name>
  <res-ref-type>javax.sql.DataSource</res-ref-type>
  <res-auth>Container</res-auth>
</resource-ref>

jdbc/rhwebDB
javax.sql.DataSource
容器

如果这不起作用,你可以检查一些其他方法。

我终于解决了它!!

也许这是一个解决办法,但它是有效的

我将app目录/META-INF/context.xml文件复制到:

$CATALINA_BASE/conf/[engineame]/[hostname]/context.xml.default (注意文件名的“默认”部分)

正如合同中所述

现在我不需要在我的应用程序的web.xml文件中添加任何条目,也不需要在我的应用程序目录中添加META-INF/context.xml文件(该目录位于Tomcat的/webapps目录中)

我只需要在以下路径中列出的每个文件夹中放置一个context.xml.default文件(包含其数据库信息):

$CATALINA_BASE/conf/[enginename]/

我的服务器中的哪个是:

/usr/local/easy/etc/easy-tomcat7/Catalina/

因此,对于该网站,我将其复制到:

/usr/local/easy/etc/easy-tomcat7/Catalina/myDomain.com/

您会注意到,我的路径与Tomcat文档中指定的路径不同,这是因为我使用的是CPanel的easy Tomcat 7,它的结构与普通Tomcat不同。这一事实使得在寻找解决方案时,即使它被称为easy-Tomcat,一切都变得更加复杂


关于为什么Tomcat永远无法读取/META-INF/context.xml,这仍然是一个疑问,但老实说,我不太在乎,因为这种方法更简单(一个文件而不是两个文件)

请发布完整的异常堆栈跟踪。这是唯一的异常堆栈跟踪,因为异常是在“try-catch”中处理的。我可以修改代码以获得完整的堆栈跟踪,但是,由于这是一台生产服务器,我必须在午夜后执行此操作。在进行了一些更改之后,现在我得到的异常是:DBUtil.NamingException-javax.naming.NameNotFoundException:Name[rhwebDB]未绑定在此上下文中。找不到[rhwebDB]。我应该把这个问题放在一个新问题上吗?顺便说一句,我昨晚遇到的一个例外是因为我试图将JDK 1.8与Tomcat 7一起使用。然后我读到它们不兼容,所以现在我使用JDK 1.7。您的问题不包含完整的堆栈跟踪,只包含错误消息。在任何情况下。可能会将资源的名称更改为
jdbc/rhwebDB
(我不确定是否需要
jdbc/
,但所有示例都包含它),并相应地更改JDNI查找。此外,签出注释并不真正适用于代码,在任何情况下,您都需要使用
e.printStackTrace()
来获取完整的堆栈跟踪(或为您提供的实际日志框架)
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
<Host name="rhweb.mx" appBase="webapps">
<Context path="" reloadable="false" docBase="/home/rhmexweb/public_html" />
</Host>
<GlobalNamingResources>
  <Resource
    name="jdbc/rhweb_rhwebDB"
    auth="Container"
    type="javax.sql.DataSource"
    ...
  />
</GlobalNamingResources>
<Context>
  <ResourceLink
    global="jdbc/rhweb_rhwebDB"
    name="jdbc/rhwebDB"
    type="javax.sql.DataSource"
  />
</Context>
<resource-ref>
  <res-ref-name>jdbc/rhwebDB</res-ref-name>
  <res-ref-type>javax.sql.DataSource</res-ref-type>
  <res-auth>Container</res-auth>
</resource-ref>