首页 文章

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

提问于
浏览
0

使用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中的Resource标记添加到server.xml文件(GlobalNamingResources标记),停止/启动tomcat,并得到相同的错误 .

更新3

通过改变java调用池的方式,我得到了所有与Andreas的专家帮助(谢谢!)的工作:

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日志中生成警告) .

1 回答

  • 1

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

    接下来, 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在没有 WEB-INF/web.xml 中的 <resource-ref> 元素的情况下工作正常,但如果它们存在则更好,以便与其他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>
    

    并在 $CATALINA_BASE/lib 中放置 ojdbcXXX.jar .

相关问题