javax.naming.NameNotFoundException:Name [jdbc/TomcatPool] is not bound in this Context Unable to fin

        今天,我在做使用Web内置连接池获取数据源的时候,遇到了这种错误:javax.naming.NameNotFoundException: Name [jdbc/TomcatPool] is not bound in this Context. Unable to find [jdbc].   意思大概是说创建的JNDI容器中没有该名称,也就是说在JNDI容器中搜索不到特定名称的数据源。

使用Web服务器内置数据源步骤如下:

    1.创建一个Web工程,项目架构如下。

javax.naming.NameNotFoundException:Name [jdbc/TomcatPool] is not bound in this Context Unable to fin_第1张图片

2.编写Utils目录下的JDBCUtil.java

package com.nyist.cn.Utils;
import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class JDBCUtil {

private static DataSource ds = null;
static{
try {
Context initCtx = new InitialContext();
Context envCtx = (Context)initCtx.lookup("java:comp/env"); //创建JNDI容器
System.out.println(envCtx);
ds = (DataSource)envCtx.lookup("jdbc/TomcatPool"); //从JNDI容器中 检索数据源
} catch (Exception e) {
throw new RuntimeException(e);
}
}

public static Connection getConnection() throws SQLException{
return ds.getConnection();
}

}

3.编写Dao目录下的JNDIDao.java

package com.nyist.cn.Dao;
import java.sql.Connection;
import java.sql.SQLException;
import com.nyist.cn.Utils.JDBCUtil;
public class JNDIDao {

public void add() throws SQLException{
Connection con = JDBCUtil.getConnection();
System.out.println("Connection:"+con);
}

}

4.编写Servlet目录下的JNDIServlet.java

package com.nyist.cn.Servlet;

import java.io.IOException;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.nyist.cn.Dao.JNDIDao;

@WebServlet("/servlet")
public class JNDIServlet extends HttpServlet{
private static final long serialVersionUID = 1L;

/**配置Tomcat数据源的方法
* 1.在META-INF下面创建context.xml文件。
* 2.当Web容器启动的时候,会自动加载context.xml  生成DataSource 放到JNDI容器里边去
* 3.在Servlet程序中,我们通过  名称   获取在JNDI中相应的 数据源
*/
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
JNDIDao dao = new JNDIDao();
try {
dao.add();
} catch (SQLException e) {
throw  new RuntimeException(e);
}
}

@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}

}


5.在WebRoot/META-INF下创建context.xml文件

javax.naming.NameNotFoundException:Name [jdbc/TomcatPool] is not bound in this Context Unable to fin_第2张图片

文件内容如下:



username="root" password="410923" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/lhg" maxTotal="8" maxIdle="4" initialSize="10"
/>

        写好这个Web工程之后,我们部署到本地服务器上,运行确保如下错误(确实应该报错误,但是报错的错误不对,不是想要的那种错误)



        我在仔细对照,在JBDI容器种的数据源的名称,并没有错,但是为什么会包这样的错误呢?

         原因:创建 WebRoot/META-INF/context.xml,当Web服务器解析的时候,会生成对应的配置文件,这个配置放在那里呢? 就放在F:\apache-tomcat-9.0.0.M26\conf\Catalina\localhost  我们只需要将下边的生成的配置文件删掉一个在重新发布工程就OK了,解决了这个问题。

        *注意:context.xml中没有  这个头

        但是运行后,我们会发现又换了一种错误:

javax.naming.NameNotFoundException:Name [jdbc/TomcatPool] is not bound in this Context Unable to fin_第3张图片

        我们从错误反馈信息可以看出,是由于没有mysql的连接驱动造成的。很奇怪,为什么我明明在我的Web工程lib文件加下导入了驱动了啊,但是还报这种错误呢?

        原因:我们使用的是tomcat内置的连接池,也就是服务器帮我们创建好连接池,所以我们应该给服务器提供连接数据库的驱动才行,否则就会报这样的错误。

        解决办法:在tomcat的lib目录下导入连接mysql的驱动文件


        在此部署项目,部署成功后,访问。运行成功,结果如下:

javax.naming.NameNotFoundException:Name [jdbc/TomcatPool] is not bound in this Context Unable to fin_第4张图片

你可能感兴趣的:(Mysql)