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;We will use a books table.
+--------+--------------+------+-----+---------+----------------+
| 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)
DriverManager
The first example will use a DriverManager.style.css
* { font-size: 12px; font-family: Verdana }This is the stylesheet file.
td { border: 1px solid #ccc; padding: 3px }
th { border: 1px solid #ccc; padding: 3px;
background: #009999; color: white }
web.xml
<?xml version="1.0" encoding="UTF-8"?>In the web.xml configuration file, we configure our servlet.
<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>
DriverManagerExample.java
package com.zetcode;The example will display a books table from the books database in a html table.
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);
}
}
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");We load the driver and get the connection to the database.
Connection con = DriverManager.getConnection(url, "root", "");
Figure: DriverManager
DataSource
The next example uses the DataSource facility. We use the same data.style.css
* { font-size: 12px; font-family: Verdana }Simple stylesheet.
td { border: 1px solid #ccc; padding: 3px }
th { border: 1px solid #ccc; padding: 3px;
background: #009999; color: white }
resin-web.xml
<web-app xmlns="http://caucho.com/ns/resin">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.
<!--
- 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>
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;The example will display a books table from the books database in a html table too.
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);
}
}
public void setDataSource(DataSource ds) {The method is called by the Resin application server at configuration time.
_ds = ds;
}
public void init()The
throws ServletException {
if (_ds == null) {
throw new ServletException("datasource not properly configured");
}
}
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.
Figure: DataSource
In this chapter we have briefly mentioned DataSource and DriverManager.
0 comments:
Post a Comment