Home  Contents

DataSource & DriverManager

In this part of the JEE 5 tutorials, we will compare DataSource object with the DriverManager object.

DataSource and the DriverManager are the two basic ways to connect to a database in a JEE application. The DriverManager is older facility, DataSource is newer. It is recommended to use the new DataSource facility to connect to databases and other resources. DataSource facility has several advantages over DriverManager facility. Using DataSource increases portability. The DataSource enables connection pooling and distributed transactions, the DriverManager does not allow such techniques. Properties of a DataSource are kept in a configuration file. Any changes to the data source or database drivers are made in the configuration file. In case of a DriverManager, these properties are hard coded in the application and for any changes we must recompile the code.

In this chapter, we will have two examples. One of the examples will use a DriverManager, the other one will use a DataSource to connect to a MySQL database.

mysql> describe books;
+--------+--------------+------+-----+---------+----------------+
| Field  | Type         | Null | Key | Default | Extra          |
+--------+--------------+------+-----+---------+----------------+
| id     | int(11)      | NO   | PRI | NULL    | auto_increment | 
| author | varchar(30)  | YES  |     | NULL    |                | 
| title  | varchar(40)  | YES  |     | NULL    |                | 
| year   | int(11)      | YES  |     | NULL    |                | 
| remark | varchar(100) | YES  |     | NULL    |                | 
+--------+--------------+------+-----+---------+----------------+
5 rows in set (0.27 sec)

We will use a books table.

DriverManager

The first example will use a DriverManager.

style.css
* { font-size: 12px; font-family: Verdana }

td { border: 1px solid #ccc; padding: 3px }
th { border: 1px solid #ccc; padding: 3px; 
    background: #009999; color: white }

This is the stylesheet file.

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
    <servlet>
        <servlet-name>DriverManager</servlet-name>
        <servlet-class>com.zetcode.DriverManagerExample</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DriverManager</servlet-name>
        <url-pattern>/DriverManager</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
</web-app>

In the web.xml configuration file, we configure our servlet.

DriverManagerExample.java
package com.zetcode;

import java.io.*;
import java.net.*;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.*;
import javax.servlet.http.*;


public class DriverManagerExample extends HttpServlet {

  static final String url = "jdbc:mysql://localhost:3306/books";


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

      response.setContentType("text/html;charset=UTF-8");
      PrintWriter out = response.getWriter();

      try {


        Class.forName("com.mysql.jdbc.Driver");
        Connection con = DriverManager.getConnection(url, "root", "");

        Statement stmt = con.createStatement();
        ResultSet result = stmt.executeQuery("SELECT * FROM books");

        out.print("<html>");
        out.print("<head>");
        out.print("<title>Servlet NewServlet</title>");
        out.print("<link rel='stylesheet' href='style.css' type='text/css'>");
        out.print("</head>");
        out.print("<body>");

        out.print("<table>");
        out.print("<tr>");
        out.print("<th>Author</th>");
        out.print("<th>Title</th>");
        out.print("<th>Year</th>");
        out.print("<th>Remark</th>");
        out.print("</tr>");


        while (result.next()) {
            out.print("<tr>");
            out.print("<td>");
            out.print(result.getString("author"));
            out.print("</td>");
            out.print("<td>");
            out.print(result.getString("title"));
            out.print("</td>");
            out.print("<td>");
            out.print(result.getString("year"));
            out.print("</td>");
            out.print("<td>");
            out.print(result.getString("remark"));
            out.print("</td>");
            out.print("</tr>");
        }

        con.close();

        } catch (SQLException ex) {
            Logger.getLogger(DriverManagerExample.class.getName()).log(
                    Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(DriverManagerExample.class.getName()).log(
                    Level.SEVERE, null, ex);
        } finally {
            out.close();
        }
    }


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

          processRequest(request, response);
    }


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

          processRequest(request, response);
    }

}

The example will display a books table from the books database in a html table.

static final String url = "jdbc:mysql://localhost:3306/books";

We provide the connection url. This is an url for a MySQL database.

Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection(url, "root", "");

We load the driver and get the connection to the database.

DriverManager
Figure: DriverManager

DataSource

The next example uses the DataSource facility. We use the same data.

style.css
* { font-size: 12px; font-family: Verdana }

td { border: 1px solid #ccc; padding: 3px }
th { border: 1px solid #ccc; padding: 3px; 
    background: #009999; color: white }

Simple stylesheet.

resin-web.xml
<web-app xmlns="http://caucho.com/ns/resin">
  <!--
     - Configures the database.
     -
     - jndi-name specifies the JNDI name
     - type      specifies the driver class
     - path      is a driver-specific configuration parameter
    -->
 <database>
 <jndi-name>jdbc/mysql</jndi-name>
  <driver>
    <type>com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource</type>
    <url>jdbc:mysql://localhost:3306/books</url>
    <user>root</user>
    <password></password>
  </driver>
  </database>

  <!--
     - Configures the initialization servlet.  The bean-style init
     - it used to look up the JNDI DataSource in the configuration file.
    -->

   <servlet>
    <servlet-name>datasource</servlet-name>
    <servlet-class>com.zetcode.DataSourceExample</servlet-class>
        <init>
      <data-source>${jndi:lookup('jdbc/mysql')}</data-source>
    </init>
  </servlet>

  <servlet-mapping>
    <url-pattern>/DataSource</url-pattern>
    <servlet-name>datasource</servlet-name>
  </servlet-mapping>

</web-app>

This is the resin-web.xml configuration style. It is Resin specific. It overrides the configuration in the web.xml file. In our file, we configure the datasource and the servlet mapping.

The DataSource configuration is done within the <database> tags. We specify the driver type, connection url, user name and password.

In our example, we use the JNDI (The Java Naming and Directory Interface) API. This API is used to look up data and objects via a name. The JNDI enables separation of resource configuration from the application code.

DataSourceExample.java
package com.zetcode;

import java.io.*;
import java.net.*;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.sql.DataSource;

public class DataSourceExample extends HttpServlet {

    private DataSource _ds = null;


    public void setDataSource(DataSource ds) {
        _ds = ds;
    }


    public void init()
            throws ServletException {
        if (_ds == null) {

            throw new ServletException("datasource not properly configured");
        }
    }

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

        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();


        try {

          Connection conn = _ds.getConnection();

          Statement stmt = conn.createStatement();
          ResultSet result = stmt.executeQuery("SELECT * FROM books");

          out.print("<html>");
          out.print("<head>");
          out.print("<title>DataSource</title>");
          out.print("<link rel='stylesheet' href='style.css' type='text/css'>");
          out.print("</head>");
          out.print("<body>");

          out.print("<table>");
          out.print("<tr>");
          out.print("<th>Author</th>");
          out.print("<th>Title</th>");
          out.print("<th>Year</th>");
          out.print("<th>Remark</th>");
          out.print("</tr>");


          while (result.next()) {
              out.print("<tr>");
              out.print("<td>");
              out.print(result.getString("author"));
              out.print("</td>");
              out.print("<td>");
              out.print(result.getString("title"));
              out.print("</td>");
              out.print("<td>");
              out.print(result.getString("year"));
              out.print("</td>");
              out.print("<td>");
              out.print(result.getString("remark"));
              out.print("</td>");
              out.print("</tr>");
           }


          out.print("</table>");
          out.println("</body>");
          out.println("</html>");

          result.close();
          stmt.close();
          conn.close();

        } catch (SQLException ex) {
            Logger.getLogger(DataSourceExample.class.getName()).log(
                    Level.SEVERE, null, ex);
        } finally {
            out.close();
        }
    }

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

        processRequest(request, response);
    }

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

        processRequest(request, response);
    }
}

The example will display a books table from the books database in a html table too.

public void setDataSource(DataSource ds) {
    _ds = ds;
}

The method is called by the Resin application server at configuration time.

public void init()
        throws ServletException {
    if (_ds == null) {

        throw new ServletException("datasource not properly configured");
    }
}

The init() method checks whether the datasource was configured properly.

Connection conn = _ds.getConnection();

We get the connection from the datasource object.

This chapter of the JEE tutorials was about DataSource and DriverManager.

DataSource
Figure: DataSource

In this chapter we have briefly mentioned DataSource and DriverManager.