如何配置tomcat数据源以及Cannot create JDBC driver of class '' for connect URL 'null'

时间:2020-12-25 17:08:59

最近折腾TOMCAT数据源的时候,遇到了一个错误:Cannot create JDBC driver of class '' for connect URL 'null'。


配置某个web项目私有的数据源,比如我的web项目名叫jndi:

1.将数据库驱动放到WEB-INF/lib下

如何配置tomcat数据源以及Cannot create JDBC driver of class '' for connect URL 'null'

2.在META-INF下建立context.xml

<?xml version="1.0" encoding="UTF-8"?>  
<Context>
<Resource
name="jdbc/mysql"
auth="Container"
type="javax.sql.DataSource"
initialSize="5"
maxActive="5"
maxIdle="5"
username="root"
password="root"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/test"
factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"/>

</Context>
如何配置tomcat数据源以及Cannot create JDBC driver of class '' for connect URL 'null'

3.web.xml建立对数据源的引用

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

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

<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>

</web-app>

4.启动web项目可以通过下面的代码验证是否可以成功获取到数据源和数据库连接
<%@ page contentType="text/html;charset=utf-8"%>
<%@ page import="java.sql.*, javax.sql.*, javax.naming.*" %>

<%

Connection conn = null;

try
{
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/mysql");
System.out.println(ds.getClass());
conn = ds.getConnection();
System.out.println(conn.getClass());
System.out.println(conn.hashCode());

}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
conn.close();
}

%>


配置项目私有的数据源这个比较简单,我自己在配置的时候也没有遇到问题。现在看下如何配置一个共有数据源,即webapp下的每个项目都可以访问的数据源。

1.将数据库驱动加入到%TOMCAT_HOME%/lib下

如何配置tomcat数据源以及Cannot create JDBC driver of class '' for connect URL 'null'

2.在%TOMCAT_HOME%/conf/server.xml中的<GlobalNamingResources>节点下增加配置:

<!--配置MySQL数据库的JNDI数据源-->
<Resource
name="jdbc/mysql"
auth="Container"
type="javax.sql.DataSource"
initialSize="5"
maxActive="5"
maxIdle="5"
username="root"
password="root"
driverClassName="com.mysql.jdbc.Driver"
factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
url="jdbc:mysql://localhost:3306/test"/>


启动tomcat,通过mysql的"SHOW processlist"可以看到,数据库连接是可以成功建立的。

如何配置tomcat数据源以及Cannot create JDBC driver of class '' for connect URL 'null'

3.既然已经配置了全局数据库连接,我们就可以删除jndi项目下的数据库驱动jar和context.xml,然后访问jsp发现:不能获取数据库连接。

如何配置tomcat数据源以及Cannot create JDBC driver of class '' for connect URL 'null'


折腾了很久,最终在这篇博客“在Tomcat配置JNDI数据源的三种方式”中找到了解决方案:还必需在jndi这个web项目下提供context.xml,内容配置如下:

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

<ResourceLink name="jdbc/mysql" type="javax.sql.DataSource" global="jdbc/mysql"/>

</Context>


值得一提的是:如果context.xml配置如上所示,那么我们在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>