【问题标题】:porting web app to Tomcat: javax.naming.NameNotFoundException:将 Web 应用程序移植到 Tomcat:javax.naming.NameNotFoundException:
【发布时间】:2017-05-21 21:09:51
【问题描述】:

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

通过更改 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 日志中生成警告)。

【问题讨论】:

  • 什么代码抛出异常?
  • @EJP 当然,我在更新 1 上方添加了引发异常的代码。

标签: java tomcat servlets jdbc web.xml


【解决方案1】:

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

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

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

如果没有WEB-INF/web.xml 中的&lt;resource-ref&gt; 元素,Tomcat 可以正常工作,但如果它们存在则更好,以便与其他 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

【讨论】:

  • 感谢@Anderas,(1)server.xml 文件包含完整的&lt;Resource&gt; 元素,context.xml 也是如此(2)Oracle 的ojdbc.jar 文件位于$CATALINA_HOME/lib 文件夹中,(3)我还没有定义$CATALINA_BASE,所以它应该默认为$CATALINA_HOME,(4)文件夹$CATALINA_HOME/conf/catalina/localhost中没有文件,Tomcat应该放什么吗?
  • 也许这已经改变了。它曾经在那里复制META-INF/context.xml 文件,以webapp 命名,在您的情况下为myapp.xml。试着自己做。我从不使用META-INF/context.xml,总是手动配置的conf/catalina/localhost/myapp.xml 文件,因为它取决于server.xml 文件的配置方式。
  • 并且记得在更改conf文件(包括子文件夹)时重新启动Tomcat。
  • [enginename] = Catalina (来自 server.xml 中的 &lt;Engine name="Catalina"&gt;[hostname] = localhost (来自 &lt;Engine ... defaultHost="localhost"&gt;&lt;Host name="localhost"&gt;,除非你在 Tomcat 中做虚拟主机).
  • 那么也许你在 Java 代码中做错了。你做了initContext.lookup("java:/comp/env").lookup("jdbc/pool1")吗?显示代码。见Apache Tomcat 8 - JNDI Resources HOW-TO - Using resources
猜你喜欢
  • 2013-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多