JNDI数据源局部配置(解决Cannot create JDBC driver of class '' for connect URL 'null')

最开始,我是借鉴 孤傲苍狼的JNDI教程去做的,他讲得很详细,但是坏处也就是因为他讲的太详细。查了很多书,都是建议说不要用全局去配置JNDI,一是要修改tomcat的server.xml,容易破坏tomcat ,其次是那样吃力不讨好。我是建议用局部变量就好的。

1.步骤一:学习配置JNDI之前,介绍你一定要先掌握tomcat的配置虚拟目录(可以去看Tomcat中主目录配置与虚拟目录配置问题这样的文章,也可以去我的tomcat配置虚拟目录 -思维焦点网易博客找类似的链接)。学习了tomcat的配置虚拟目录后你就知道了为什么要在  tomcat安装目录\conf\Catalina\localhost   下创建.xml文件。

2.步骤二: 开始通过局部配置JNDI(这个教程也只讲局部配置)。

下面会附上代码,标注颜色的,你要根据自己的实际情况改一下。

3.步骤三:最后通过tomcat的startup.bat启动和用电脑的浏览器是可以看到成功连接数据源和驱动的,但是用eclipse启动tomcat就不能了,总是提示Cannot create JDBC driver of class ‘‘ for connect URL ‘null‘问题 ,后来找到了tomcat+mysql问题,找不到jdbc驱动? ,说是jdbc for mysql除了mysql-connector-java-3.1.8-bin.jar之外还要个aspectjrt.jar,一起放在WEB-INF\lib  里面,结果没问题,可以运行了。网上很多资料和书都没有提到这个,我也不知道什么原因需要copy aspectjrt.jar 这个东西,也可能时tomcat版本或是jdbc版本问题。如果还是不行的话,可以再尝试这种方法:Tomcat下使用Druid配置JNDI数据源

--------------------------------------------------------------我是可爱的分割线-----------------------------------------------------

继续详解步骤二,附上代码:

1.首先,新建一个Test_JNDI的工程,然后在mysql和sqlserver数据库中创建名为test的数据库(只测试这两种数据库)。然后,在工程里创建test_jndi.jsp,然后在这个jsp中贴上代码

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 <%@ page import="java.sql.*,javax.sql.*,javax.naming.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
   <head>
     <title>JNDI数据源测试</title>
   </head>
   <body>
         <%
             Connection connMySQL = null;
             try {
                 //1、初始化名称查找上下文
                 Context ctx = new InitialContext();
                 //InitialContext ctx = new InitialContext();亦可
                 //2、通过JNDI名称找到DataSource,对名称进行定位java:comp/env是必须加的,后面跟的是DataSource名
                 /*
                 DataSource名在web.xml文件中的<res-ref-name>mysqlDataSource</res-ref-name>进行了配置
                   <!--MySQL数据库JNDI数据源引用 -->
                   <resource-ref>
                       <description>MySQL DB Connection</description>
                       <res-ref-name>mysqlDataSource</res-ref-name>
                       <res-type>javax.sql.DataSource</res-type>
                       <res-auth>Container</res-auth>
                   </resource-ref>
                 */
                 DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/mysql");
                 //3、通过DataSource取得一个连接
                 connMySQL = ds.getConnection();
                 out.println("MySQL Connection pool connected !!");
                 //4、操作数据库
             } catch (NamingException e) {
                 System.out.println(e.getMessage());
             } catch (SQLException e) {
                 e.printStackTrace();
             } finally {
                 //5、关闭数据库,关闭的时候是将连接放回到连接池之中
                connMySQL.close();
             }
         %>

         <hr/>
         <%
             Connection connSQLServer = null;
             try {
                 //1、初始化名称查找上下文
                 Context ctx = new InitialContext();
                 //InitialContext ctx = new InitialContext();亦可
                 //2、通过JNDI名称找到DataSource,对名称进行定位java:comp/env是必须加的,后面的是DataSource名
                 /*
                 DataSource名在web.xml文件中的<res-ref-name>sqlserverDataSource</res-ref-name>进行了配置
                 <!--SQLServer数据库JNDI数据源引用 -->
                   <resource-ref>
                       <description>SQLServer DB Connection</description>
                       <res-ref-name>sqlserverDataSource</res-ref-name>
                       <res-type>javax.sql.DataSource</res-type>
                       <res-auth>Container</res-auth>
                   </resource-ref>
                 */
                 DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/sqlserver");
                 //3、通过DataSource取得一个连接
                 connSQLServer = ds.getConnection();
                 out.println("SQLServer Connection pool connected !!");
                 //4、操作数据库
             } catch (NamingException e) {
                 System.out.println(e.getMessage());
             } catch (SQLException e) {
                 e.printStackTrace();
             } finally {
                 //5、关闭数据库,关闭的时候是将连接放回到连接池之中
                 connSQLServer.close();
             }
         %>

     </body>
 </html>

2.然后,在工程目录下的WebContent下的.xml文件中,

添加如下代码:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	<display-name>Test_JNDI</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>test_jndi.jsp</welcome-file>
	    <welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
   <!--MySQL数据库JNDI数据源引用 -->
   <resource-ref>
       <description>MySQL 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>
   <!--SQLServer数据库JNDI数据源引用 -->
   <resource-ref>
      <description>sqlserver DB Connection</description>
       <res-ref-name>jdbc/sqlserver</res-ref-name>
       <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
    </resource-ref>

</web-app>

3.最后,也是最重要,最容易出错的,就是在tomcat安装目录\conf\Catalina\localhost   下创建 Test_JNDI.xml文件(文件名最好和项目名Test_JNDI一样,不一样的情况我还没实验过)

(1).可以先在Test_JNDI.xml文件中添加如下代码,然后在浏览器输入对于URL,验证是否能访问项目首页。

<?xml version="1.0" encoding="UTF-8"?>
 <Context path="/Test_JNDI" docBase="E:/EclipseEE/workspace/Test_JNDI/WebContent" reloadable="true" debug="0" crossContext="true" /> 

注意1:上面这段代码是不带标签体的标签,跟下面的代码是不一样的。具体是<Context  .......   /> 和 <Context  .......   >.....这里是数据源信息</Context >这两个代码语法是有区别的,一个是有标签体的。

注意2:xml文件中不能出现任何一个中文,不然启动tomcat会报错(tomcat报错 Invalid byte 2 of 2-byte UTF-8 sequence

注意3:上面这段代码中的<?xml 前面不能有空格, 否则tomcat报错(不允许有匹配 "[xX][mM][lL]" 的处理指令目标

(2).贴上完整代码:

<?xml version="1.0" encoding="UTF-8"?>
 <Context path="/Test_JNDI" docBase="E:/EclipseEE/workspace/Test_JNDI/WebContent" reloadable="true" debug="0" crossContext="true" >
  <Resource
     name="jdbc/mysql"
         auth="Container"
         type="javax.sql.DataSource"
         maxActive="100"
         maxIdle="30"
         maxWait="10000"
         username="root"
         password="0821"
         driverClassName="com.mysql.jdbc.Driver"
         url="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8"/>

     <Resource
         name="jdbc/sqlserver"
         auth="Container"
         type="javax.sql.DataSource"
         maxActive="100"
         maxIdle="30"
         maxWait="10000"
         username="sa"
         password="0821"
         driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
         url="jdbc:sqlserver://localhost:1433;DatabaseName=test"/>
 </Context>

注意:

用户名和密码设置成你自己电脑的数据库,test为数据库。

name="jdbc/sqlserver" ,名字在所有地方有要保持一致。

path="/Test_JNDI" 里的名字要设置成和跟这个.xml文件一样。

运行成功结果:

--------------------------------------------------------------我是可爱的分割线-----------------------------------------------------

本文参考:1.JNDI数据源的配置-孤傲苍狼

2.JNDI到底是什么?

3. Tomcat中主目录配置与虚拟目录配置问题

温馨提示:copy代码后粘贴到eclipse如果存留行号,可以利用的eclipse的快捷键alt+shit+a 将行号批量选中删除。

原创不易,请注明转载:http://blog.csdn.net/sinat_31719925

JNDI数据源局部配置(解决Cannot create JDBC driver of class '' for connect URL 'null')

时间: 2024-10-25 21:24:26

JNDI数据源局部配置(解决Cannot create JDBC driver of class '' for connect URL 'null')的相关文章

SQLNestedException: Cannot create JDBC driver of class &#39;&#39; for connect URL &#39;null&#39; 解决办法

当跑jndi项目时抛出:org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'异常 解决办法: 1.在Tomcat 6.0\lib下加入oracle驱动包ojdbc14_g-10.2.0.1.0.jar 2.在Tomcat 6.0\conf下的context.xml文件中加入 [javascript] view plaincopy <R

Cannot create JDBC driver of class &#39;&#39; for connect URL &#39;null&#39;问题解决

Cannot create JDBC driver of class '' for connect URL 'null'问题解决方法1 严格来说也不叫错 只是不同的版本写法不一样 tomcat-5.0.28是这种形式 <Resource name="jdbc/conn" type="javax.sql.DataSource"/> <ResourceParams name="jdbc/conn"> <parameter

Cannot create JDBC driver of class &#39;&#39; for connect URL &#39;null&#39;

1.错误描述 严重: 抛出了"org.apache.tomcat.dbcp.dbcp.SQLNestedException"异常:Cannot create JDBC driver of class '' for connect URL 'null' 堆栈: org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(1452). org.apache.tomcat.dbcp.dbcp.BasicDataSou

JNDI学习总结(一)——JNDI数据源的配置

一.数据源的由来 在Java开发中,使用JDBC操作数据库的四个步骤如下: ①加载数据库驱动程序(Class.forName("数据库驱动类");)   ②连接数据库(Connection con  = DriverManager.getConnection();)   ③操作数据库(PreparedStatement stat = con.prepareStatement(sql);stat.executeQuery();)   ④关闭数据库,释放连接(con.close();) 也

JNDI数据源的配置

一.数据源的由来 在Java开发中,使用JDBC操作数据库的四个步骤如下: ①加载数据库驱动程序(Class.forName("数据库驱动类");)   ②连接数据库(Connection con  = DriverManager.getConnection();)   ③操作数据库(PreparedStatement stat = con.prepareStatement(sql);stat.executeQuery();)   ④关闭数据库,释放连接(con.close();) 也

Cannot create JDBC driver of class &#39;com.p6spy.engine.spy.P6SpyDriver&#39;

Cannot create JDBC driver of class 'com.p6spy.engine.spy.P6SpyDriver' 开始不知为何报如此错,因为用IronTrackSQL已经不是一次两次了 jar包,spy.properties都应该没问题,但是就是报这个错. 后来在网上查到,把spy.properties放到tomcat/bin目录下即可解决该问题. 这种问题真想仔细检查检查到底问题出在什么地方... Cannot create JDBC driver of class

JNDI数据源配置

在Java Web开发中都要与数据库打交道,为了不频繁地打开和关闭数据库,以减少数据库操作负荷,可使数据库在开发过程中保持打开状态,在这里我们采用配置数据源的方式(JNDI),而不是传统地JDBC方式.下面就针对常规型的MySQL5.0.15和Tomcat6.0的数据源的基本配置进行简单的介绍:    首先声明,如果数据源没有配置好的话,在开发过程中会抛出诸如下列异常等:    1.org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot cr

spring配置tomcat的jndi数据源

刚在tomcat中配了一遍jndi的数据源,通过spring引用,中间出了一个问题,一直报 : "cannot create jdbc driver of class " for connect url 'null'" 配置步骤就不在这里写了,主要参考tomcat和spring的官方手册. tomcat官方手册 spring官方手册 来说说我遇到的这个问题吧,主要是由于我是在 "WEBAPP/META-INF/context.xml" 中定义的jndi数据

JNDI学习总结(三)——Tomcat下使用Druid配置JNDI数据源

com.alibaba.druid.pool.DruidDataSourceFactory实现了javax.naming.spi.ObjectFactory,可以作为JNDI数据源来配置. 一.下载Druid的jar包 下载地址:http://mvnrepository.com/artifact/com.alibaba/druid/1.0.9,如下图所示: druid.jar依赖log4j的jar包,所以还需要下载log4j的jar包. log4j的下载地址如下:http://mvnreposi