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

Ser*_*gio 10 java tomcat meta-inf jdbc context.xml

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

我有一个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();
}
Run Code Online (Sandbox Code Playgroud)

这是我的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>
Run Code Online (Sandbox Code Playgroud)

我不使用WAR文件.我只是将文件上传到我的服务器并在需要时重新启动tomcat,这通常可以正常工作.

如果这也是相关的,Tomcat的server.xml文件具有此网站的此设置.我也试过添加参数copyXML ="true",到目前为止没有运气:

       <Host name="rhweb.net" appBase="webapps">
       <Alias>www.rhweb.net</Alias>
       <Context path="" reloadable="false" docBase="/home/rhweb/public_html" debug="1"/>
       </Host>
Run Code Online (Sandbox Code Playgroud)

这是我的应用程序尝试与MySQL建立连接时获得的完整堆栈跟踪:

javax.naming.NameNotFoundException: Name [jdbc/rhwebDB] is not bound in this Context. Unable to find [jdbc].
    at org.apache.naming.NamingContext.lookup(NamingContext.java:820)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:154)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:831)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:154)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:831)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:168)
    at org.apache.naming.SelectorContext.lookup(SelectorContext.java:158)
    at javax.naming.InitialContext.lookup(InitialContext.java:415)
    at util.DBUtil.<clinit>(DBUtil.java:23)
    at Solutio.AdminRH.Entity.ISeguridadAdminDB.verificaUsuario(ISeguridadAdminDB.java:142)
    at org.apache.jsp.menu_jsp._jspService(menu_jsp.java:115)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:200)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
Run Code Online (Sandbox Code Playgroud)

我也尝试在我的应用程序的web.xml文件中添加这些行(我没有必要包含在我的Windows机器中)

   <resource-ref>
       <description>MySQL RhWeb Datasource</description>
       <res-ref-name>jdbc/rhwebDB</res-ref-name>
       <res-type>javax.sql.DataSource</res-type>
       <res-auth>Container</res-auth>
   </resource-ref>
Run Code Online (Sandbox Code Playgroud)

当我包含这些行时,我得到的例外就是这个:

org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
Run Code Online (Sandbox Code Playgroud)

似乎Tomcat无法找到我的META-INF/context.xml文件,或者它无法识别此链接:

ds =(DataSource)context.lookup("java:comp/env/jdbc/rhwebDB");

我的linux,Tomcat和JDK版本是:

CentOS 6.8版(最终版)
Apache Tomcat/7.0.42
java版"1.7.0_131"

我不知道我还能尝试解决这个问题.任何帮助将非常感激

UPDATE

我还没有找到解决方案.我已经意识到可能与这一切有关的一些可能的配置问题:

该应用程序位于:

/家庭/ rhmexweb /的public_html

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

<Host name="rhweb.mx" appBase="webapps">
<Context path="" reloadable="false" docBase="/home/rhmexweb/public_html" />
</Host>
Run Code Online (Sandbox Code Playgroud)

之所以没有位于webapps目录,是因为CPanel会自动在/ home/account-name/public_html中创建每个帐户,这就是为什么这里需要一个上下文元素(我猜).如果我删除整个Context标签,而是使用appBase ="/ home/rhmexweb/public_html",那么Tomcat将无法找到WEB-INF文件夹中的所有jar和内容(/ home/rhmexweb/public_html/WEB- INF).我之所以提到这一点是因为我添加了参数copyXML ="true",只是为了看看tomcat尝试复制context.xml文件的位置,如果它改变了它的名字,但事实证明有两个不同的路径.首先,当我第一次包含该参数时,我获得了写入权限异常,并且它试图在此处创建一个文件夹:

在/ var/lib中/易tomcat7/webapps /目录

此路径仅包含默认tomcat应用程序的文件夹(manager,examples&host-manager)

列出所有网站的文件夹和所有已编译的jsp文件都是这个:

在/ usr /本地/易的/ etc /易tomcat7 /卡塔利娜/

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

无论如何,我想知道的是,如果在主机定义中有一个Context元素可能是Tomcat的一个问题,以便找到appPath/META-INF/context.xml文件.

Kar*_*cki 7

看起来context.xml设置有问题。尝试server.xml/META-INF/context.xml查看它的行为是否有任何不同。

您可以尝试移动配置到server.xml为每个Tomcat的7文档

<GlobalNamingResources>
  <Resource
    name="jdbc/rhweb_rhwebDB"
    auth="Container"
    type="javax.sql.DataSource"
    ...
  />
</GlobalNamingResources>
Run Code Online (Sandbox Code Playgroud)

链接到全球资源context.xml

<Context>
  <ResourceLink
    global="jdbc/rhweb_rhwebDB"
    name="jdbc/rhwebDB"
    type="javax.sql.DataSource"
  />
</Context>
Run Code Online (Sandbox Code Playgroud)

然后/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>
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,您可以检查此答案中讨论的其他一些方法。


Ser*_*gio 4

我终于解决了!!

也许这是一种解决方法,但它确实有效。

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

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

正如Tomcat 文档中所述

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

我需要的只是将 context.xml.default 文件(包含它的数据库信息)放入此路径中列出的每个文件夹中:

$CATALINA_BASE/conf/[引擎名称]/

在我的服务器中是:

/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,这仍然是一个谜,但说实话,我不太关心,因为这种方法更容易(一个文件而不是两个)