Name jdbc is not bound in this context

本文详细解析了javax.naming.NameNotFoundException: Name jdbc is not bound in this Context错误的原因及解决方法,包括正确配置Tomcat的context.xml和应用的web.xml文件,确保资源引用的一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

"javax.naming.NameNotFoundException: Name jdbc is not bound in this Context"

 

这个错误网络上一大堆。大概知道这是应为WEB-INF里的web.xml文件中没有以下配置或者是配置错误:

 

<resource-ref>


  <description>GuestBook</description>


  <res-ref-name>jdbc/oracleds</res-ref-name>  


  <res-type>javax.sql.DataSource</res-type>


  <res-auth>Container</res-auth>  


 </resource-ref> 

 

首先,我们在Tomcat安装文件中找到 conf/context文件并打开, 在这里,我以我用的Oracle数据库

 

来配置。

 


 <Resource name="jdbc/oracleds" auth="Container" type="javax.sql.DataSource"

 

 maxIdle="30" maxActive="10" maxWait="10000" username="scott" password="113416"

 

 driverClassName="oracle.jdbc.OracleDriver" 

 

 url="jdbc:oracle:thin:@127.0.0.1:1521:SNAIL"/>

 


而在WEB-INF文件下的 web.xml中,我们配置

 

<resource-ref></resource-ref> 的信息必须与Tomcat中的配置信息一一对应。

 

 

例如:

 

在Tomcat中配置的name="jdbc/oracleds" ,而在 web.xml文件中配置的name="jdbc/oracle"都会引起

 

javax.naming.NameNotFoundException: Name jdbc is not bound in this Context  错误提示!



认真的看了自己的context.xml和web.xml中的配置,觉得它们正确无误。而错误依然不能消除,那么你看这篇文章就对了,也许它会是你的指路明灯。

你看一下自己的JSP文件,是否有这样一句:

DataSource ds=(DataSource)initContext.lookup("java:/comp/env/jdbc/xinabai");

请将它改为:

 Context initContext = new InitialContext();   
 Context envContext = (Context)initContext.lookup("java:/comp/env");      
DataSource ds = (DataSource)envContext.lookup("jdbc/xinbai");

虽然无数本书和帖子告诉你,这两个方法相同。但是,很明显,前一种会在某种情况下产生Name jdbc is not bound in this Context的错误。

具体原因我不清楚,希望知道原因的高人可以告知一二。


### 在web.xml中配置mysql-connector-java 在Java Web应用程序中,`web.xml` 文件用于定义应用程序的部署描述符。尽管 `web.xml` 本身并不直接与 MySQL 驱动程序(如 `mysql-connector-java`)进行集成,但它可以通过 JNDI 数据源的方式间接配置数据库连接资源。以下是关于如何通过 `web.xml` 和 Tomcat 的 `context.xml` 或 `server.xml` 配置文件来实现 MySQL 数据库连接的具体方法。 #### 1. 配置 Tomcat 的数据源 首先需要在 Tomcat 中配置一个 JNDI 数据源。这通常通过编辑 `context.xml` 或 `server.xml` 文件完成。以下是一个示例配置: ```xml <Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource" maxTotal="100" maxIdle="30" maxWaitMillis="10000" driverClassName="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC" username="root" password="password" /> ``` 上述代码片段定义了一个名为 `jdbc/test` 的 JNDI 数据源[^3]。确保将驱动程序类名设置为 `com.mysql.cj.jdbc.Driver`,这是 MySQL Connector/J 8.x 的默认驱动程序类名。 #### 2. 将 MySQL 驱动添加到 Tomcat 为了使 Tomcat 能够识别 MySQL 驱动程序,必须将 `mysql-connector-java` 的 JAR 文件放置在 Tomcat 的全局类路径中。具体位置通常是 `Tomcat/lib` 目录下[^2]。如果将驱动程序放置在 Web 应用程序的 `WEB-INF/lib` 目录下,则可能导致某些情况下无法正确加载驱动程序。 #### 3. 配置 web.xml 接下来,在 `web.xml` 文件中声明对 JNDI 数据源的引用。以下是一个示例配置: ```xml <resource-env-ref> <description>DB Connection</description> <resource-env-ref-name>jdbc/test</resource-env-ref-name> <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type> </resource-env-ref> ``` 此配置告诉容器应用程序需要使用名为 `jdbc/test` 的 JNDI 数据源[^4]。注意,`resource-env-ref-name` 的值应与 Tomcat 中定义的数据源名称一致。 #### 4. 使用数据源 在 Java 代码中,可以通过以下方式获取数据源实例: ```java Context initContext = new InitialContext(); Context envContext = (Context) initContext.lookup("java:/comp/env"); DataSource ds = (DataSource) envContext.lookup("jdbc/test"); Connection conn = ds.getConnection(); ``` 上述代码展示了如何通过 JNDI 查找数据源并获取数据库连接[^1]。 ### 注意事项 - 确保 `mysql-connector-java` 的版本与使用的 MySQL 数据库版本兼容。 - 如果遇到 `Name jdbc is not bound in this Context` 错误,请检查 Tomcat 的配置文件是否正确加载了数据源。 - 如果使用的是较新的 Tomcat 版本(如 Tomcat 9),请确保 URL 参数中的 `serverTimezone` 设置为正确的时区。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值