java 带有 mysql 的 Tomcat:“无法为连接 URL 'null' 创建类 '' 的 JDBC 驱动程序”

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/11292529/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 04:33:18  来源:igfitidea点击:

Tomcat with mysql : " Cannot create JDBC driver of class '' for connect URL 'null' "

javamysqltomcatdatabase-connectionjndi

提问by Divij

This question has been asked and answered multiple times but it still doesn't solve my problem.

这个问题已经被多次询问和回答,但它仍然没有解决我的问题。

Host OS is Fedora 17

主机操作系统是 Fedora 17

Tomcat package tomcat-7.0.27-2.fc17.noarch

Tomcat 包 tomcat-7.0.27-2.fc17.noarch

Here is my $CATALINA_HOME/logs/catalina.out

这是我的 $CATALINA_HOME/logs/catalina.out

[DEBUG]: Failed to establish connection with datastore
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1452)
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371)
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
...
...
Caused by: java.sql.SQLException: No suitable driver
    at java.sql.DriverManager.getDriver(DriverManager.java:289)
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1437)
...

Here is my $CATALINA_HOME/conf/Catalina/localhost/ABC/ABC.xml

这是我的 $CATALINA_HOME/conf/Catalina/localhost/ABC/ABC.xml

<Context path="/ABC">

<!-- maxActive: Maximum number of dB connections in pool. Make sure you
     configure your mysqld max_connections large enough to handle
     all of your db connections. Set to -1 for no limit.
     -->

<!-- maxIdle: Maximum number of idle dB connections to retain in pool.
     Set to -1 for no limit.  See also the DBCP documentation on this
     and the minEvictableIdleTimeMillis configuration parameter.
     -->

<!-- maxWait: Maximum time to wait for a dB connection to become available
     in ms, in this example 10 seconds. An Exception is thrown if
     this timeout is exceeded.  Set to -1 to wait indefinitely.
     -->

<!-- username and password: DB username and KeyDB password key (not the password itself)  -->

<!-- driverClassName: Class name for the JDBC KeyDB wrappers.  These wrappers
     replace the 'mysql_keydb_key' with its corresponding value from KeyDB
     -->

<!-- url: The JDBC connection url for connecting to your MySQL dB.
     The autoReconnect=true argument to the url makes sure that the
     mm.mysql JDBC Driver will automatically reconnect if mysqld closed the
     connection.  mysqld by default closes idle connections after 8 hours.
     -->

<Resource name="jdbc/last_db" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="****" password="****" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/last_db"/>
</Context>

Here is my $CATALINA_HOME/lib directory

这是我的 $CATALINA_HOME/lib 目录

$ ls /usr/share/tomcat/lib
annotations-api.jar      commons-collections.jar    log4j.jar                          tomcat-i18n-es.jar      tomcat-servlet-3.0-api.jar
apache-commons-dbcp.jar  commons-dbcp.jar           mysql-connector-java-5.1.0.jar  tomcat-i18n-fr.jar      tomcat-util.jar
catalina-ant.jar         commons-logging-1.1.1.jar  tomcat-api.jar                  tomcat-i18n-ja.jar
catalina-ha.jar          jasper-el.jar              tomcat-coyote.jar               tomcat-jdbc.jar
catalina.jar             jasper.jar                 tomcat-dbcp.jar                 tomcat-jsp-2.2-api.jar
catalina-tribes.jar      jasper-jdt.jar             tomcat-el-2.2-api.jar           tomcat-juli.jar

Here is my WEB-INF/web.xml

这是我的 WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app 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_2_5.xsd"
version="2.5">

<servlet>
    <servlet-name>jersey</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>jersey</servlet-name>
    <url-pattern>/v1/*</url-pattern>
</servlet-mapping>
<resource-ref>
    <description>DB Connection</description>
    <res-ref-name>jdbc/last_db</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

</web-app>

Executing code:

执行代码:

try {
    Context initContext = new InitialContext();
    Context envContext  = (Context)initContext.lookup("java:/comp/env");
    dataSource = (DataSource) envContext.lookup("jdbc/"+dbName);
 } catch (NamingException ex) {
    System.out.println("[DEBUG]: Failed to initiate JDBC context");
    ex.printStackTrace();
    return;
 }

 try {
     connection = dataSource.getConnection();
 } catch (SQLException ex){
     System.out.println("[DEBUG]: Failed to establish connection with datastore");
     ex.printStackTrace();
     return;
 } catch (ClassNotFoundException ww){
     ww.printStackTrace();
 }

The mysql-connector jar seems to be available in WEB-INF/lib

mysql-connector jar 似乎在 WEB-INF/lib 中可用

$ jar tf ABC.war | grep mysql-connector
WEB-INF/lib/mysql-connector-java-5.1.0.jar

I don't know if this is useful or not but here is the listening port information for port 3306

我不知道这是否有用,但这里是端口 3306 的侦听端口信息

$ netstat -tln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN     

采纳答案by Divij

I feel like banging my head on the table.

我想把头撞在桌子上。

The problem was that instead of keeping the ABC.xml $CATALINA_HOME/conf/Catalina/localhost/ABC/ABC.xml It is supposed to be kept here: $CATALINA_HOME/conf/Catalina/localhost/ABC.xml

问题是,而不是保留 ABC.xml $CATALINA_HOME/conf/Catalina/localhost/ABC/ABC.xml 它应该保留在这里: $CATALINA_HOME/conf/Catalina/localhost/ABC.xml

The StackTrace was very misleading regarding error with the connector driver.

StackTrace 在连接器驱动程序错误方面非常具有误导性。