java - 将 Web 应用程序移植到 Tomcat : javax. naming.NameNotFoundException:

标签 java tomcat servlets jdbc web.xml

使用 Java SE 8 的 Linux CentOS 7 上 Tomcat (8.5.9) 的新用户。我一定是犯了一个简单的错误。这应该是一个教科书示例如何为tomcat配置JDBC连接池。

我有这个错误:

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

知道我做错了什么吗? Tomcat states It is NOT recommended to place <Context> elements directly in the server.xml file.因此,我的设置:

$CATALINA_HOME/webapps/myapp/META-INF/context.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<Context>
  <Resource name="jdbc/pool1"
            auth="Container"
            type="javax.sql.DataSource"
            username="xx"
            password="xx"
            driverClassName="oracle.jdbc.OracleDriver"
            url="xx"
            maxTotal="256"
            maxIdle="8"
            initialSize="4"
            removeAbandonedTimeout="7200"
            removeAbandonedOnBorrow="true"/>

  <Resource name="jdbc/pool2"
            auth="Container"
            type="javax.sql.DataSource"
            username="xx"
            password="xx"
            driverClassName="oracle.jdbc.OracleDriver"
            url="xx"
            maxTotal="256"
            maxIdle="8"
            initialSize="4"
            removeAbandonedTimeout="7200"
            removeAbandonedOnBorrow="true"/>

  <ResourceLink name="jdbc/pool1"
                global="jdbc/pool1"
                type="javax.sql.DataSource"/>

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

$CATALINA_HOME/webapps/myapp/WEB-INF/web.xml如下:

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

导致异常的代码:

 Context context = new InitialContext();
 DataSource ds = (DataSource)context.lookup("jdbc/pool1");
 conn = ds.getConnection();

我根本没有修改 $CATALINA_HOME/conf/server.xml。我是否配置不正确,或者我是否遗漏了在某处设置另一个文件?

更新 1

我尝试将上面的 ResourceLinks 添加到 $CATALINA_HOME/conf/server.xml 文件中的 GlobalNamingResources 标签,然后停止/启动 Tomcat,但我得到了同样的错误。

更新 2

然后我将上面 context.xml 中的资源标签也添加到 server.xml 文件(GlobalNamingResources 标签),停止/启动 tomcat,并得到同样的错误。

更新 3

在 Andreas 的专家帮助下(谢谢!),我通过更改 java 调用池的方式让一切正常工作:

Context initCtx = new InitialContext();
Context context = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource) context.lookup("jdbc/pool1");
conn = ds.getConnection();  

此外,ResourceLinks 不应该在 server.xml 中(它们只是在 tomcat 日志中生成警告)。

最佳答案

你的 $CATALINA_BASE/conf/server.xml文件应包含完整的 <Resource>元素。记住还要将 JDBC 驱动程序 jar 文件添加到 Tomcat 的 $CATALINA_BASE/lib文件夹,因为它是 Tomcat,而不是您的 webapp,所以当 <Resource> 时需要它在 server.xml 中定义.

接下来,META-INF/context.xml是在第一次 部署您的 webapp 时使用的模板。它被复制到 $CATALINA_BASE/conf/Catalina/localhost/myapp.xml , 如果您更改 META-INF/context.xml 可能不会更新/刷新.

.../Catalina/localhost/myapp.xml文件应包含 <ResourceLink>元素,将 webapp 使用的名称映射到 server.xml 中使用的名称.使这两个名称保持相同是最简单的,但不是必需的。

Tomcat 在没有 <resource-ref> 的情况下工作正常WEB-INF/web.xml 中的元素, 但最好有它们,以便与其他 Servlet 容器兼容。

注意: $CATALINA_BASE通常与 $CATALINA_HOME 相同,即安装 Tomcat 的文件夹,除非您明确配置它。

所以,$CATALINA_BASE/conf/server.xml :

<?xml version='1.0' encoding='utf-8'?>
<Server ...>
    ...
    <GlobalNamingResources>
        ...
        <Resource name="jdbc/pool1" auth="Container" type="javax.sql.DataSource" ... />
        <Resource name="jdbc/pool2" auth="Container" type="javax.sql.DataSource" ... />
        ...
    </GlobalNamingResources>
    ...
</Server>

$CATALINA_BASE/conf/Catalina/localhost/myapp.xml :

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <ResourceLink name="jdbc/pool1" global="jdbc/pool1" type="javax.sql.DataSource"/>
    <ResourceLink name="jdbc/pool2" global="jdbc/pool2" type="javax.sql.DataSource"/>
</Context>

并放置ojdbcXXX.jar$CATALINA_BASE/lib .

关于java - 将 Web 应用程序移植到 Tomcat : javax. naming.NameNotFoundException:,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41516977/

相关文章:

java - 行程 : making double array String into a Map of String, 字符串(键和值)

java - 如何在 Spring Boot 中聚合健康指标

java - 当我在 JPanel 上绘制背景图像时,它在 Windows 下的行为与在 Linux 下的行为不同

java - Jsp - 获取所有以字符开头的参数

java - 如何将 HttpServletRequest 转换为字符串?

Java - 数组元素的排列 - 解释清楚

java - IntelliJ和Tomcat的配置中出现这个奇怪的错误的原因和可能的解决方案是什么?

html - CSS 适用于 JBoss (OpenShift),但不适用于 Tomcat 7

oracle - 如何在 Apache Tomcat 8 中为 Oracle 数据库连接池配置加密

java - JSESSIONID 持续时间