javax.naming.NameNotFoundException : Name [jdbc/rhwebDB] is not bound in this Context. 无法找到 [jdbc]

标签 java tomcat jdbc context.xml meta-inf

我知道有很多关于此异常的问题,但是,我相信我已经尝试了很多天的所有方法,但还没有成功。由于这是一个生产服务器,我只能在午夜后处理它:(

我有一个 Tomcat 应用程序。最近,我更新了连接池,以便使用 Tomcat 的 jdbc-connection pool。在我的 Windows 开发机器中,一切正常,但现在我正尝试在我的 Linux 服务器上实现它,每当我的应用程序尝试连接到 MySQL 时,我都会收到此异常(见标题)。

我正在使用“Easy Tomcat 7”,它应该与普通版本的 Tomcat 相同,只是它带有 CPanel 软件。

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

这是我的 Java 数据库类:

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>

我不使用 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>

这是我的应用程序尝试与 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)

我还尝试将这些行添加到我的应用程序的 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>

当我包含这些行时,我得到的异常是这一行:

org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'

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”

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

更新

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

应用位于此处:

/home/rhmexweb/public_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 中创建每个帐户,所以这就是为什么这里需要一个上下文元素(我猜)。如果我删除整个 Context 标签,而是使用 appBase="/home/rhmexweb/public_html",Tomcat 将不会从 WEB-INF 文件夹中找到所有的 jar 和内容(/home/rhmexweb/public_html/WEB-INF)。我提到这个是因为我添加了参数 copyXML="true" 只是为了查看 tomcat 会在哪里尝试复制 context.xml 文件,如果它更改了它的名称,但事实证明有两个不同的路径。首先,当我第一次包含该参数时出现写入权限异常,它试图在此处创建一个文件夹:

/var/lib/easy-tomcat7/webapps/

这个路径,只包含默认tomcat应用的文件夹(manager, examples & host-manager)

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

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

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

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

最佳答案

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

您可以尝试根据 Tomcat 7 docs 将配置移动到 server.xml :

<GlobalNamingResources>
  <Resource
    name="jdbc/rhweb_rhwebDB"
    auth="Container"
    type="javax.sql.DataSource"
    ...
  />
</GlobalNamingResources>

链接到 context.xml 中的全局资源:

<Context>
  <ResourceLink
    global="jdbc/rhweb_rhwebDB"
    name="jdbc/rhwebDB"
    type="javax.sql.DataSource"
  />
</Context>

然后像您已经做的那样在 /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>

如果这不起作用,您可以检查其他几种方法 discussed in this answer .

关于javax.naming.NameNotFoundException : Name [jdbc/rhwebDB] is not bound in this Context. 无法找到 [jdbc],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50482786/

相关文章:

java - 为什么我不能访问我的静态列表中的数据?

tomcat - 读取部署在tomcat上的web.xml文件中的主机名

java - 在 Tomcat 中的其他 war 文件旁边提供单页应用程序

jdbc - Kafka Connect JDBC Sink - 一个接收器配置中每个主题(表)的 pk.fields

json - 存储 json、jsonb、hstore、xml、enum、ipaddr 等失败,显示 "column "x“是 json 类型,但表达式是字符类型变化”

java - 执行者服务中的执行者服务?

java - 将图像数据 InputStream 转换为字符串,然后从该字符串返回图像不会给出图像

java - Android 计算百分比

java - Spring不加载静态内容

java - 从 Java Servlet 调用 Firebird 存储过程