user2125853
user2125853

Reputation: 1315

When working with tomcat, how are JDBC Drivers loaded?

I am using Eclipse and tomcat 7. I have little experience with either product and for that matter Java itself. I was trying to connect to a derby database from a Servlet. Initially, all I had in my doGet() is the following:

conn = DriverManager.getConnection(connectionURL);

I have connectionURL defined as

static private String connectionURL = "jdbc:derby://localhost:1527/seconddb";

Then I added the following to the Build Path and Deployment Assembly.

C:\DERBY\db-derby-10.10.1.1-bin\lib\derbyclient.jar

That is all I did. I sort of assumed that Tomcat will find the driver class and load it. I got the following error

java.sql.SQLException: No suitable driver found for jdbc:derby://localhost:1527/seconddb

Then I went on to add the following code in doGet() to load the driver class:

    try {
           Class.forName("org.apache.derby.jdbc.ClientDriver");
        }
        catch(ClassNotFoundException ex) {
           System.out.println("Error: unable to load driver class!");
           System.exit(1);
    }

Now it worked. I thought that after Java 1.4 there was no need to explicitly load JDBC driver class. So what am I doing wrong here? I have given the entire code below.

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    Connection conn = null;

    try {
           Class.forName("org.apache.derby.jdbc.ClientDriver");
        }
        catch(ClassNotFoundException ex) {
           System.out.println("Error: unable to load driver class!");
           System.exit(1);
    }

    try {
        conn = DriverManager.getConnection(connectionURL);
        //DriverManager.getConnection("jdbc:derby://localhost:1527/testdb;create=true");
    }
    catch (SQLException e) {
        e.printStackTrace();
    }
    PrintWriter p = response.getWriter ();
    p.println("Connected to database");

    try {
        if (conn != null) {
            conn.close();
        }
    }
    catch (SQLException e) {
        e.printStackTrace();
    }
}

I am using java 1.7

Upvotes: 1

Views: 655

Answers (3)

aslotu
aslotu

Reputation: 67

I could be wrong here but in your second code sample connectionURL

static private String connectionURL = "jdbc:derby://localhost:1527/seconddb";

doesn't include "create=true"; to complete the statement. In your full code sample it's included, but commented out.

Upvotes: 0

user207421
user207421

Reputation: 310893

Your Derby driver doesn't support the JDBC 4 auto-loading, so you have to do it manually. Try to find a more up to date version.

Upvotes: 0

Serge Ballesta
Serge Ballesta

Reputation: 148900

I cannot really explain why, but here is how I do :

  • if the driver is located in the war, I must call Class.forName("...Driver"); in in initialization method somewhere in the web application.
  • if the driver is located in Tomcat libraries, it is automacally loaded when I need it.

I know it's more a rule of thumb than a clear explaination, but my knowledge in class loading does not allow me to a better answer ...

Upvotes: 1

Related Questions