将网络应用程序移植到 Tomcat:javax.naming.NameNotFoundException:
porting web app to Tomcat: javax.naming.NameNotFoundException:
Tomcat (8.5.9) 在 Linux CentOS 7 和 Java SE 8 上的新用户。我一定是犯了一个简单的错误。这应该是如何为 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 标签,然后 stopping/starting Tomcat,但我得到了同样的错误。
更新 2
然后我将上面 context.xml 中的资源标签也添加到 server.xml 文件(GlobalNamingResources 标签),stopping/starting 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
,它可能不会 updated/refreshed。
.../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>
并将 ojdbcXXX.jar
放入 $CATALINA_BASE/lib
.
Tomcat (8.5.9) 在 Linux CentOS 7 和 Java SE 8 上的新用户。我一定是犯了一个简单的错误。这应该是如何为 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 标签,然后 stopping/starting Tomcat,但我得到了同样的错误。
更新 2
然后我将上面 context.xml 中的资源标签也添加到 server.xml 文件(GlobalNamingResources 标签),stopping/starting 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
,它可能不会 updated/refreshed。
.../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>
并将 ojdbcXXX.jar
放入 $CATALINA_BASE/lib
.