在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> |
这次再访问项目,一切正常。