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

14,300

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

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

Share:
14,300
Divij
Author by

Divij

Programming enthusiast | Believes in making a difference to the world one byte at a time | Developer | Learner | Day dreamer | Sr. Software Engineer @ Amazon Neptune

Updated on June 04, 2022

Comments

  • Divij
    Divij almost 2 years

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

    Host OS is Fedora 17

    Tomcat package tomcat-7.0.27-2.fc17.noarch

    Here is my $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

    <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

    $ 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

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

    $ 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

    $ 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     
    
  • user207421
    user207421 almost 12 years
    Well it told you that the variables in the Context .xml file weren't taking effect ...