博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
org.apache.tomcat.dbcp.dbcp.SQLNestedException
阅读量:6549 次
发布时间:2019-06-24

本文共 2626 字,大约阅读时间需要 8 分钟。

hot3.png

在tomcat6.0中按照下面的步骤利用jndi配置数据库源:

第一步:

    将指定数据库的数据库驱动jar包放置到tomcat的lib目录下,项目的lib目录下不用放置。

 

第二步:

       在自己项目的META-INF目录下的新建一个文件context.xml,并添加如下的内容:

<Resource name="jdbc/mysql" auth="Container"

       type="javax.sql.DataSource" username="root" password="root"

       driverClassName="com.mysql.jdbc.Driver"

       url="jdbc:mysql://localhost:3306/test?autoReconnect=true" maxActive="8" maxIdle="4" />

 

第三步:

       在项目的web.xml中添加如下的内容:

<resource-ref>

       <description>

           DB Connection

       </description>

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

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

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

</resource-ref>

 

第四步:

       程序中这样获取:

try {

            Context initCtx = new InitialContext();

            Context envCtx = (Context) initCtx.lookup("java:comp/env");

            DataSource ds = (DataSource) envCtx.lookup("jdbc/mysql");

           

            try {

                Connection conn = ds.getConnection();

                Statement stmt = conn.createStatement();

               

                ResultSet rs = stmt.executeQuery("select * from employee");

               

                while (rs.next()) {

                    int id = rs.getInt("id");

                    System.out.println(id);

                }

               

                conn.close();

            } catch (SQLException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

           

        } catch (NamingException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

 

按照这样的操作后,访问servlet报了这样的错误:

org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'

 

国内网站上搜了一大遍没有一个弄出来的,去国外的一个网站上看了一下,发现了猫腻。

 

进入tomcat的conf/Catalina/localhost目录我们看到了myproject.xml这个文件,myproject是我项目的名称,然后打开一下这个文件查看,内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<Context>

    <Resource name="bean/MyBeanFactory" auth="Container"

       type="com.mycompany.MyBean"

       factory="org.apache.naming.factory.BeanFactory" bar="23" />

      

</Context>

 

这里只有一个Resource配置,这个是我之前配置的,没有任何上面配置的jdbc的源,上面那个链接的文章中说的就是这个原因。

 

现在好像有点头绪了,我们回过来想想,我们在自己的META-INF下建立context.xml文件,这个到底是怎么起作用的呢,我们在conf/Catalina/localhost这个目录下看到了以项目命名的xml文件,我想大概应该清楚了,当我们在自己的项目META-INF下面建立context.xml,然后将项目部署到tomcat中,启动tomcat,这时候第一次就会建立这个文件,这个文件的内容就和我们项目里面的META-INF下的context.xml内容一模一样,同时这个文件的格式和tomcat下的context.xml也一模一样,这里我们也可以猜到为什么这样就起作用呢,其实这个以项目命名的xml文件就相当于从context.xml分出来的一样,在这里配置,其实就等于在context.xml配置,conf/Catalina/localhost下的我们项目的xml内容没有我们配置的信息,当然就报错了,从tomcat中移除项目,重新部署,启动,再次查看myproject.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<Context>

    <Resource name="bean/MyBeanFactory" auth="Container"

       type="com.mycompany.MyBean"

       factory="org.apache.naming.factory.BeanFactory" bar="23" />

      

    <Resource name="jdbc/mysql" auth="Container"

       type="javax.sql.DataSource" username="root" password="root"

       driverClassName="com.mysql.jdbc.Driver"

       url="jdbc:mysql://localhost:3306/test" maxActive="8" maxIdle="4" />

      

</Context>

 

这次再访问项目,一切正常。

转载于:https://my.oschina.net/tianhandigeng/blog/98154

你可能感兴趣的文章
Python字典
查看>>
Android存储方式之SQLite的使用
查看>>
洛谷P1287 盒子与球 数学
查看>>
Bootstrap vs Foundation如何选择靠谱前端框架
查看>>
与、或、异或、取反、左移和右移
查看>>
vue常用的指令
查看>>
matlab练习程序(随机游走图像)
查看>>
Linux命令行下运行java.class文件
查看>>
input文本框实现宽度自适应代码实例
查看>>
行为型设计模式之命令模式(Command)
查看>>
减少死锁的几个常用方法
查看>>
HDFS 核心原理
查看>>
正确配置jstl的maven依赖,jar包冲突的问题终于解决啦
查看>>
安装 MariaDB
查看>>
java 为啥变量名前要加个m?
查看>>
探索Android中的Parcel机制(上)
查看>>
C#开发微信门户及应用(5)--用户分组信息管理
查看>>
怎样实现前端裁剪上传图片功能
查看>>
ffmpeg+SDL2实现的视频播放器「退出、暂停、播放」
查看>>
2011/7/3 第二次评审
查看>>