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内置连接池获取数据源的时候,遇到了这种错误:javax.naming.NameNotFoundException: Name [jdbc/TomcatPool] is not bound in this Context. Unable to find [jdbc]. 意思大概是说创建的JNDI容器中没有该名称,也就是说在JNDI容器中搜索不到特定名称的数据源。
使用Web服务器内置数据源步骤如下:
1.创建一个Web工程,项目架构如下。
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文件
文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource name="jdbc/TomcatPool" auth="Container" type="javax.sql.DataSource"
username="root" password="410923" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/lhg" maxTotal="8" maxIdle="4" initialSize="10"
/>
</Context>
<!--
name:是绑定在那个项目上的DataSource,指定web根路径在下
auth:说明验证类型为容器
driverClassName:驱动类名:指明你用的mysql驱动包
type:指定连接池所用类型为DataSource(ODBC数据源)
url:需要连接的数据库
username:数据库名称
password:数据库密码
-->
写好这个Web工程之后,我们部署到本地服务器上,运行确保如下错误(确实应该报错误,但是报错的错误不对,不是想要的那种错误)
我在仔细对照,在JBDI容器种的数据源的名称,并没有错,但是为什么会包这样的错误呢?
原因:创建 WebRoot/META-INF/context.xml,当Web服务器解析的时候,会生成对应的配置文件,这个配置放在那里呢? 就放在F:\apache-tomcat-9.0.0.M26\conf\Catalina\localhost 我们只需要将下边的生成的配置文件删掉一个在重新发布工程就OK了,解决了这个问题。
*注意:context.xml中没有<?xml version="1.0" encoding="UTF-8"?> 这个头
但是运行后,我们会发现又换了一种错误:
我们从错误反馈信息可以看出,是由于没有mysql的连接驱动造成的。很奇怪,为什么我明明在我的Web工程lib文件加下导入了驱动了啊,但是还报这种错误呢?
原因:我们使用的是tomcat内置的连接池,也就是服务器帮我们创建好连接池,所以我们应该给服务器提供连接数据库的驱动才行,否则就会报这样的错误。
解决办法:在tomcat的lib目录下导入连接mysql的驱动文件
在此部署项目,部署成功后,访问。运行成功,结果如下:
更多推荐
所有评论(0)