Análisis de rendimiento al usar un Pool de conexiones

3
27414

Análisis de rendimiento al usar un Pool de conexiones

Índice de contenido

Introducción

Toda aplicación debería cubrir de forma satisfactoria las necesidades para las que fueron creadas, siendo además muy deseable que las tareas las realizasen
usando de forma satisfactoria los recursos disponibles y proporcionase además un tiempo de respuesta adecuado al cliente.

En este tutorial vamos a analizar las mejoras en rendimiento que nos ofrece el uso de Pool de conexiones a base de datos. Para ello, realizaremos una sencilla aplicación Web (desplegada sobre Tomcat 6)
que simplemente para cada petición se conecte a una base de datos bien a través de un Pool de conexión o sin él, y analizaremos los resultados obtenidos al ejecutar un test de rendimiento
que estrese a la aplicación simulando peticiones concurrentes y constantes a la misma.

Caso de estudio: Aplicación Web

package com.autentia.tutoriales.performance;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

/**
 * Servlet que usaremos para medir el rendimiento de conexiones con y sin pool de conexiones
 * @author Carlos García. Autentia.
 */
public class TestPoolServlet extends javax.servlet.http.HttpServlet {
	
	private DataSource source;

	/* 
	 * Realizamos las tareas de inizialización
	 */
	public void init() throws ServletException {
		super.init();
		
		try {
			// Cargamos el Driver, para los accesos sin pool de conexiones.
			Class.forName("com.mysql.jdbc.Driver");
			
			// Obtenemos el pool.
			Context initCtx = new InitialContext();
			Context envCtx  = (Context) initCtx.lookup("java:comp/env");
			this.source 	= (DataSource) envCtx.lookup("jdbc/poolTutorialDB");			
		} catch (Exception e) {
			throw new ServletException(e);
		}		
	}	

	/* 
	 * Realizamos las tarea de conexión con la base de datos.
	 */
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		Connection conn	= null;
		
		try {
			resp.setContentType("text/html");
			resp.setStatus(HttpServletResponse.SC_OK);
			
			// ¿ Usamos el Pool de conexiones ?
			boolean usePool = "1".equals(req.getParameter("pool"));
			if (usePool){
				conn = source.getConnection();	
			} else {
				conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "invitado", "invitado");
			}
		} catch (Exception ex){
			resp.getWriter().println(ex.getMessage());
		} finally {
			try {
				conn.close();	// Liberamos recursos descartando las excepciones que se pudieran producir
			} catch (Exception ex){}
		}
	}
}      
    

web.xml de la aplicación web



	
	Test Performance Pool Servlet
	
	
		testPerformancePoolServlet
		com.autentia.tutoriales.performance.TestPoolServlet
	
	
	
		testPerformancePoolServlet
		/*
	

	
		jdbc/poolTutorialDB
		javax.sql.DataSource
		Container
	
	
  
    

context.xml Definición del Pool de conexiones que usará la aplicación.



	

    

Definición del test de rendimiento

A continuación creamos un test usando JMeter, puede descargar el test haciendo clic aquí.

10 clientes realizarán peticiones HTTP concurrentemente durante 5 segundos:

Petición HTTP que realizarán los clientes:

Donde:

  • WebAppPool es el contexto dentro del servidor de la aplicación web.
  • Si el parámetro pool vale 1, el servlet usará el pool de conexiones.
  • Si el parámetro pool vale 0, el servlet no usará el pool de conexiones.

Resultados obtenidos al ejecutar el test de rendimiento

Resultados sin pool de conexiones

Resultados con pool de conexiones

Análisis de los resultados obtenidos

En vista a los informes que nos proporciona JMeter podemos decir entre otras cosas:

  1. Para el mismo intervalo de tiempo, el servlet, al usar del pool ha sido capaz de atender 30727 peticiones mientras que sin el pool apenas fue capaz de atender 630 peticiones.
  2. En media, el servlet, al usar el pool a logrado atender las peticiones en 1 milisegundo, mientras que sin el uso del pool este tiempo se incrementa a 79 milisegundos.
  3. El rendimiento del servlet, al usar el pool ha sido de 6138 peticiones por segundo, mientras que sin el Pool decrece drásticamente a 124 peticiones por segundo.

En base a estos resultados, no cabe duda de la mejora que aporta el uso de los Pool de conexiones en nuestras aplicaciones.

Carlos García Pérez. Creador de MobileTest, un complemento educativo para los profesores y sus alumnos.

cgpcosmad@gmail.com

3 COMENTARIOS

  1. hola Carlo excelente ejemplo para tener en cuenta …que tal el caso de programas de escritorios ..yo tengo us soft de supermercado usando una conexión convencional normal a bases de dato del servidor lo he usado 4 años no he tenido ningùn problema …pero que opina al respecto de los programas en java de escritorio vale la pena aplicar el pool de conexiones..?

  2. Buen día. AL ser de escritorio o standalone solo es usada la aplicacion por una persona. En ese orden de ideas no vale la pena implementar un pool de conexiones.

    Es lo que considero.

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad