El concepto de Java DataSource es común en la mayor parte de las aplicaciones Java EE y hace referencia a un conjunto de conexiones a base de datos (pool de conexiones) creadas por el servidor que se alquilan durante un determinado tiempo a cada Servlet JSP o componente que lo requiera.
Estas conexiones son utilizadas por las distintos elementos de la aplicación.
El uso de estas conexiones es durante un tiempo determinado en el cual el Servlet JSP o componente la necesitan. Una vez que han terminado de usarla la devuelven al pool y así permiten su reutilización.
Configuración Java DataSource
Vamos a configurar el pool de conexiones utilizando un Tomcat .Para ello deberemos abrir el fichero server.xml de nuestro servidor. Este fichero contiene una sección de contexto por cada aplicación web desplegada. En nuestro caso la aplicación web se llama “Recursos” y por lo tanto tiene un contexto como el siguiente:
<Context docBase="Recursos" path="/Recursos" reloadable="true" source="org.eclipse.jst.jee.server:Recursos"> </Context>
Dentro de la etiqueta de contexto añadimos un “Recurso ” (Resource) que nos conecta a la base de datos.
<Context docBase="Recursos" path="/Recursos" reloadable="true" source="org.eclipse.jst.jee.server:Recursos"> <Resource name="jdbc/miDataSource" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="root" password="" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/miBaseDeDatos"/> </Context>
En este caso hemos usado un driver de MySQL que deberemos configurar en el propio Tomcat en la carpeta lib del servidor.
Recursos y web.xml
Una vez dado de alta el pool de conexiones a nivel de server.xml debemos modificar el fichero web.xml y registrarlo como un recurso accesible.
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>Recursos</display-name> <resource-ref> <description>fuente datos </description> <res-ref-name>jdbc/miDataSource</res-ref-name> <res-type>java.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> </web-app>
@Resource y Servlets
Hecho esto podemos usar directamente el recurso usando la anotación de @Resource vamos a verlo a través de un simple Servlet.
<pre> package com.arquitecturajava; import java.io.IOException; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import javax.annotation.Resource; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.sql.DataSource; @WebServlet("/WebJDBC003") public class WebJDBC003DataSourceRecurso extends HttpServlet { private static final long serialVersionUID = 1L; @Resource(name="jdbc/miDataSource") private DataSource fuente; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Connection conn = null; Statement stmt = null; try{ System.out.println("Conectando a la base de datos"); conn = fuente.getConnection(); stmt = conn.createStatement(); String sql = "INSERT INTO Personas " + "VALUES ('pepe3')"; stmt.executeUpdate(sql); }catch(SQLException se){ se.printStackTrace(); }catch(Exception e){ e.printStackTrace(); }finally{ try{ if(stmt!=null) conn.close(); }catch(SQLException se){ } try{ if(conn!=null) conn.close(); }catch(SQLException se){ se.printStackTrace(); } } } }
Como vemos ahora es muy sencillo inyectar un DataSource a un Servlet o ha cualquier otro componente como un EJB simplemente nos apoyamos en la anotación @Resource. Recordemos que si usamos JPA podemos usar las anotaciones de @PersistenceContext y @PersistenceUnit.
Otros artículos relacionados:
Como podemos usar y acceder a un pool, solo usando JSP?
Gracias.
no es una buena práctica pero tienes etiquetas de JSTL para acceso a datos
Muy buenos días, muy interesantes tus apuntes, quiero empezar a utilizar JPA en los proyectos de la empresa, pero tengo un pequeña confusión en cuanto a las conexiones del mismo, resulta que ya llevo cerca de 3 años utilizando un pool de conexiones de la forma como lo explicas, no utilizamos ningún framework para acceso a datos, solo nos basamos en las clases y utilitarios creados por nosotros, pero quiero saber cual es la forma correcta de utilizar ese mismo pool de conexiones con JPA ó quiero saber si hay una forma todavía más eficiente, es que siento que cada… Read more »
Normalmente en JPA delegas en una conexion JNDI que es la que implementa el pool de conexiones
Gran aporte Cecilio, me encanta tu blog, siempre explicando los conceptos de un modo sencillo y comprensible.
Gracias.
gracias 🙂