将web应用移植到Tomcat:javax.naming.NameNotFoundException:
使用JavaSE8在Linux CentOS 7上使用Tomcat(8.5.9)的新用户。我一定是犯了个简单的错误。这应该是如何为tomcat配置JDBC连接池的教科书示例 我有一个错误:将web应用移植到Tomcat:javax.naming.NameNotFoundException:,java,tomcat,servlets,jdbc,web.xml,Java,Tomcat,Servlets,Jdbc,Web.xml,使用JavaSE8在Linux CentOS 7上使用Tomcat(8.5.9)的新用户。我一定是犯了个简单的错误。这应该是如何为tomcat配置JDBC连接池的教科书示例 我有一个错误: javax.naming.NameNotFoundException:Name[jdbc/pool1]在此上下文中未绑定。找不到[jdbc] 知道我做错了什么吗?Tomcat不建议将元素直接放在server.xml文件中。因此,我的设置: $CATALINA_HOME/webapps/myapp/META-I
javax.naming.NameNotFoundException:Name[jdbc/pool1]在此上下文中未绑定。找不到[jdbc]
知道我做错了什么吗?Tomcat不建议将元素直接放在server.xml文件中。
因此,我的设置:
$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>
...
<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>
...
我根本没有修改$CATALINA_HOME/conf/server.xml。我是否配置不正确,或者在某个地方缺少设置另一个文件
更新1
我尝试将上述资源链接添加到$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();
此外,ResourceLink不应位于server.xml中(它们只是在tomcat日志中生成警告)。您的
$CATALINA_BASE/conf/server.xml
文件应包含完整的
元素。还记得将JDBC驱动程序jar文件添加到Tomcat的$CATALINA_BASE/lib
文件夹中,因为在server.xml
中定义
时需要它的是Tomcat,而不是您的webapp
接下来,META-INF/context.xml
是第一次部署webapp时使用的模板。它被复制到$CATALINA_BASE/conf/CATALINA/localhost/myapp.xml
,如果您更改META-INF/context.xml
,它可能不会更新/刷新
../Catalina/localhost/myapp.xml
文件应该包含
元素,将webapp使用的名称映射到server.xml
中使用的名称。保持这两个名称相同是最简单的,但不是必需的
Tomcat在没有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>
<?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
什么代码引发异常?@EJP当然,我添加了引发异常的代码,就在更新1上面。谢谢@Anderas,(1)server.xml
文件包含完整的
元素,就像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
文件,该文件以您的案例中的webappmyapp.xml
命名。你自己试试吧。我从不使用META-INF/context.xml
,它始终是一个手动配置的conf/catalina/localhost/myapp.xml
文件,因为它取决于server.xml
文件的配置方式。在对conf
文件(包括子文件夹)进行更改时,请记住重新启动Tomcat(来自server.xml中的
)和[hostname]
=localhost
(来自
和
,除非您在Tomcat中进行虚拟托管)。那么您在Java代码中可能做得不对。您是否执行了initContext.lookup(“Java:/comp/env”)。lookup(“jdbc/pool1”)
?显示代码。请参阅。
<?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>