javax.naming.NameNotFoundException:名称 [jdbc/rhwebDB] 未在此上下文中绑定。找不到 [jdbc]
javax.naming.NameNotFoundException: Name [jdbc/rhwebDB] is not bound in this Context. Unable to find [jdbc]
我知道有很多关于此异常的问题,但是,我相信我已经尝试了很多天的所有方法,但还没有成功。由于这是一个生产服务器,我只能在午夜后处理它:(
我有一个 Tomcat 应用程序。最近,我更新了连接池,以便使用 Tomcat 的 jdbc-连接池。在我的 Windows 开发机器中,一切正常,但现在我试图在我的 Linux 服务器上实现它,每当我的应用程序尝试连接到 MySQL.
我用的是"Easy Tomcat 7",应该和普通版Tomcat一样,只不过是CPanel软件自带的。
我只需要此数据库可用于此应用程序(而不是多个应用程序)。
这是我的 java 数据库 class:
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文件,或者它不认识这个link:
ds = (DataSource)context.lookup("java:comp/env/jdbc/rhwebDB");
我的 linux、Tomcat 和 JDK 版本是:
CentOS 6.8 版(最终版)
阿帕奇 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 中找到所有的 jar 和内容-INF 文件夹(/home/rhmexweb/public_html/WEB-INF)。我提到这个是因为我添加了参数 copyXML="true" 只是为了看看 tomcat 会在哪里尝试复制 context.xml 文件,如果它改变了它名称,但事实证明有两条不同的路径。首先,当我第一次包含该参数时出现写入权限异常,它试图在此处创建一个文件夹:
/var/lib/easy-tomcat7/webapps/
此路径仅包含默认 tomcat 应用程序(管理器、示例和主机管理器)的文件夹
列出所有网站和所有编译的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>
link 到 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。
我终于解决了!!
也许这是一种解决方法,但它确实有效。
我将 app-directory/META-INF/context.xml 文件复制到:
$CATALINA_BASE/conf/[引擎名]/[主机名]/context.xml.default
(注意文件名的 "default" 部分)
中所述
现在我不需要在我的应用程序的 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,这仍然是一个谜,但老实说,我不在乎,因为这种方法更容易(一个文件而不是两个)
我知道有很多关于此异常的问题,但是,我相信我已经尝试了很多天的所有方法,但还没有成功。由于这是一个生产服务器,我只能在午夜后处理它:(
我有一个 Tomcat 应用程序。最近,我更新了连接池,以便使用 Tomcat 的 jdbc-连接池。在我的 Windows 开发机器中,一切正常,但现在我试图在我的 Linux 服务器上实现它,每当我的应用程序尝试连接到 MySQL.
我用的是"Easy Tomcat 7",应该和普通版Tomcat一样,只不过是CPanel软件自带的。
我只需要此数据库可用于此应用程序(而不是多个应用程序)。
这是我的 java 数据库 class:
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文件,或者它不认识这个link:
ds = (DataSource)context.lookup("java:comp/env/jdbc/rhwebDB");
我的 linux、Tomcat 和 JDK 版本是:
CentOS 6.8 版(最终版)
阿帕奇 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 中找到所有的 jar 和内容-INF 文件夹(/home/rhmexweb/public_html/WEB-INF)。我提到这个是因为我添加了参数 copyXML="true" 只是为了看看 tomcat 会在哪里尝试复制 context.xml 文件,如果它改变了它名称,但事实证明有两条不同的路径。首先,当我第一次包含该参数时出现写入权限异常,它试图在此处创建一个文件夹:
/var/lib/easy-tomcat7/webapps/
此路径仅包含默认 tomcat 应用程序(管理器、示例和主机管理器)的文件夹
列出所有网站和所有编译的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>
link 到 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。
我终于解决了!!
也许这是一种解决方法,但它确实有效。
我将 app-directory/META-INF/context.xml 文件复制到:
$CATALINA_BASE/conf/[引擎名]/[主机名]/context.xml.default (注意文件名的 "default" 部分)
中所述现在我不需要在我的应用程序的 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,这仍然是一个谜,但老实说,我不在乎,因为这种方法更容易(一个文件而不是两个)