org.apache.tomcat.dbcp.dbcp.SQLNestedException

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

第一步:

    将指定数据库的数据库驱动jar包放置到tomcatlib目录下,项目的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'

 

国内网站上搜了一大遍没有一个弄出来的,去国外的一个网站上看了一下,发现了猫腻。http://blogs.agilefaqs.com/2009/11/23/cannot-create-jdbc-driver-of-class-for-connect-url-null/

 

进入tomcatconf/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>

 

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


你可能感兴趣的:(JNDI)