El
objeto de este documento es establecer una norma para el acceso a datos
desde las aplicaciones web desarrolladas en Java, en ATICA. Esta norma
propone el uso de fuente de datos (DataSource), para tal fin.
La
API JDBC (Java Data Base Connectivity) proporciona una interfaz de
programación para acceso a datos de Base de Datos Relacionales desde el
lenguaje de programación Java:
El paquete java.sql es el corazón de la API JDBC 2.0.
El
paquete javax.sql es la API de Extensión Estándar JDBC 2.0; y
proporciona la funcionalidad de fuente de datos (objeto DataSource), y
agrupación de conexiones (connection pooling).
2. Fuente de Datos (DataSource)
Una fuente de datos representa una base de datos del mundo real, como puede ser una base de datos relacional Oracle.
Cuando
registramos una fuente de datos en el servicio de nombres JNDI (Java
Name Directory Interface), cualquier aplicación puede recuperar la
fuente de datos desde el servicio de nombres y utilizarla para realizar
una conexión a la base de datos que representa.
Al usar fuentes
de datos, las aplicaciones no necesitan tener información específica
como el nombre de la base de datos, el ID del usuario, o la clave para
obtener una conexión a BD. Todo esta información se almacena en forma
de propiedades en el objeto DataSource. Esto hace que la aplicación sea
más portable porque no es necesario escribir en el código el nombre del
driver, lo cual frecuentemente implica incluir el nombre de un
fabricante en particular.
El mantenimiento del código se hace
mucho más fácil. Por ejemplo, si la Base de Datos (que representa la
fuente de datos) se traslada a un servidor diferente, lo único que hay
que hacer es cambiar la propiedad correspondiente en el objeto fuente
de datos. El código de la aplicación que utiliza la fuente de datos no
hay que tocarlo para nada.
En el caso concreto del servidor de
aplicaciones WebSphere, la conexión obtenida de la fuente de datos es
una conexión "agrupada" (pooled connection), es decir, cuando la
aplicación cierra la conexión la devuelve a una agrupación de
conexiones (connection pool), en lugar de destruirse. El objeto
Connection se obtiene de una agrupación (pool) de conexiones gestionada
por el servidor de aplicaciones.
Una aplicación deber seguir los siguientes pasos para acceder a una fuente de datos que representa una base de datos relacional:
Recuperar un objeto DataSource del servicio de nombres JNDI.
Obtener
un objeto Connection de la fuente de datos llamando al método
getConnection() de la misma. La conexión en este caso es agrupada
(pooled connection), y se obtiene de la agrupación de conexiones.
La aplicación envía consultas o actualizaciones SQL a la Base de Datos.
La aplicación procesa los resultados.
Para
la utilización de fuente de datos en una aplicación recomendamos
utilizar el paquete atica.util; concretamente la clase
atica.util.obj.HttpServletBD, si es un servlet (o
atica.util.obj.ObjectBD, si es un objeto aislado); de forma que nuestra
clase la extienda. La clase HttpServletBD del mencionado paquete (y su
homóloga ObjectBD), acepta el nombre del DataSource como parámetro.
Veamos un ejemplo de cada caso:
Ejemplo 1. Ejemplo con HttpServletBD
package atica.samples;
public class SampleServlet extends atica.util.obj.HttpServletBD {
public SampleServlet() {
super("NombreFuenteDatos");
}
public void service(javax.servlet.http.HttpServletRequest req,
javax.servlet.http.HttpServletResponse res)
throws javax.servlet.ServletException {
Connection conn = getConnection();
·········
freeConnection(conn);
}
}Ejemplo 2. Ejemplo con ObjectBD
package atica.samples;
public class SampleObject extends atica.util.obj.ObjectBD {
public SampleObject() {
super("NombreFuenteDatos");
}
public void metodoQuery() {
java.sql.Connection conn = null;
try {
conn = getConnection();
·········
} catch (Exception ex) {
} finally {
freeConnection(conn);
}
}
}En el apéndice pueden verse los detalles del paquete atica.util: clases que lo componen e interrelación entre las mismas.
A. Paquete atica.util.
El
paquete contiene las clases necesarias para acceder a BD usando
DataSource. Ha sido desarrollado por Juan José Meroño, del Servicio de
Desarrollo de ATICA. Contiene:
Un interface, DBConnection, que proporciona los métodos necesarios para manejar las conexiones: getConnection y freeConnection.
La
implementación, DBConnectionImpl (también existe la implementación sólo
para WebSphere, DBConnectionImpWebSphere), es la que realmente accede
al objeto DataSource en cuestión.
El factory,
DBConnectionFactory, para independizar el resto del código de un cambio
en la implementación; por ejemplo, DBConnectionImpl o
DBConnectionImplWebSphere.
Objeto genérico para un servlet, HttpServletBD, es la clase que extenderá nuestra aplicación en caso de tratarse de un servlet.
Objeto genérico para un "objeto aislado", ObjectBD.
Figura A.1. Relación entre las clases
El
paquete está instalado, como un jar (dsatica.jar), en los servidores de
Sistemas (tanto en desarrollo como en explotación). Además, en Novell,
en G:\Servicio de
Desarrollo\MNCS\Publicado\WebConnector\Datasource\Software\aticaDS.jar,
está el jar con las clases y también la javadoc correspondiente (no
están los fuentes). Los enlaces son:
Javadoc del paquete aticaDS.jar
Paquete aticaDS.jar
El
paquete incluye un servlet, atica.samples.SnoopServletBD, para hacer un
seguimiento de las conexiones del datasource en cuestión. En la
pantalla correspondiente se debe observar que el número de conexiones
utilizadas debe ser igual al de las que se van liberando. A
continuación están los enlaces del SnoopServletBD para Dumbo y Luci:
SnoopServletBD para Dumbo
SnoopServletBD para Luci