HashMap: Depurando el ingreso a base de datos. SGCE2013

Normalmente no es ningún problema ir a una tabla y recabar los datos necesarios, como una lista de productos en tienda y sus precios. Pero ponte a pensar en lo poco eficiente que es ir una y otra vez por datos que en realidad no están cambiando con tanta frecuencia.

Hace no mucho tiempo tuve un pequeño problema de comunicación entre mi servidor de procesos y el de base de datos, pero resultó en que para un acceso a datos, solo para el proceso de autentificación del usuario se tardaba alrededor de tres o cuatro segundos, para la industria para la que trabajo, donde un proceso no debe tardarse más de los 8 segundos, este performance es terrible (Desarrollo clientes/servidor para PoS).

De allí que decidí disminuir a lo más mínimo (¡depurar!) el acceso a datos vía consultas. Busqué alternativas que me permitiera que con un solo ingreso a BDD [base de datos], en mi mente al inicio de mi clase principal, se recabaran los datos de uso recurrente y se pusieran a disposición para el resto de los procesos y objetos en cualquier tiempo.
¡Y fue así como los encontré! ¡Los HashMap!

Un HashMap es una colección desordenado de objetos, es un tanto similar a un Array. Este se guarda en memoria durante la ejecución lo que permite reusarlo. Primero necesitaremos importar dos clases:
 
Puede ser diferente, para mi problema particular lo defino y pueblo de datos al inicio de mi clase principal:
 

El Hashmap consta de dos dimensiones: un identificador y un objeto: HashMap(K,V). En mi ejemplo (arriba) defino que tanto la clave como el valor serán de tipo String. Como el valor K representa una llave, si yo defino varios valores a una K igual, solo el último permanecerá en la lista, utilicemos el método para ingresar datos en un HashMap .put(K,V) para el siguiente ejemplo:
 

Inicialmente a la clave “Refrescos” le asignaste “20.00” y reasignaste “10.00”. Si preguntas al HashMap el valor de la clave “Refrescos” te regresará “10.00”.

String precio=(String) map.get((“Refrescos”);

Pero aquí nos encontramos con que un HashMap es un objeto bidimensional (K,V), y que pasa si necesitamos usar más que un dato para cierta clave, en mi caso necesitaba el identificador de producto, el precio, si tiene impuesto…etc.!

Pues, retomando que el HashMap es similar a un arreglo, podemos asignarle a una clave, un valor de tipo arreglo, que dicho sea de paso es un objeto de tipo arreglo, ósea definiremos:
 
Igualmente necesitamos rescribir el método de poblado:
 

El último ajuste aquí sería el método de acceso a los datos, si podemos usar map.get(K), pero en virtud de que es un objeto, no tenemos la facilidad de usar el datos sin procesar antes. Entonces:

 

Para poder hacer uso de estas colecciones de datos, yo las voy pasando entre objetos conforme lo voy necesitando (así evito las consultas adicionales). Por ejemplo:
 
Por supuesto la clase ProductProcessor espera un HashMap con las caracteristicas del que le envío:
 
Espero me haya podido explicar, te sugiero no cortar y pegar el código de este artículo, puede no funcionar y te puede resultar más didáctico, usarlo, pero poco a poco conforme lo vas entendiendo. Por supuesto, estoy a tus órdenes ( Twitter @Gi_Giorgio ), ojalá encuentres el uso de HashMap tan útil como a mí.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Shadonwk

mmm no es lo mismo que los

mmm no es lo mismo que los caches ??

Imagen de neko069

Yo lo veo más como una

Yo lo veo más como una alternativa básica a las cargas tempranas de JPA, cuando haces relaciones uno a muchos, (el EAGER sobre una propiedad de la entidad que sea Collection), cuando haces algo por demás sencillo, buen post.

Imagen de ezamudio

Cache

Para que realmente se pueda usar como cache, es necesario hacer algunas modificaciones:

1. El método getProductos debe poblar el mapa una sola vez, considerando incluso el caso de que la tabla estuviera vacía.
2. Agregar un método que invalide el cache para repoblar el mapa.
3. Agregar candados para acceso concurrente, en caso que dos o más hilos invoquen el método al mismo tiempo, sólo uno debe causar la consulta en base de datos, las demás invocaciones esperan y al final leen el mapa de memoria.

Imagen de GiGiorgio

Saludos

En realidad lo que hago es mas sencillo, es al iniciar la clase principal, esta es la que consulta la bdd, y solo allí. El resto de las clases, cuando hacen algun nuevo hilo toman el mapa cuando son iniciadas, y así como se evita la múltiple consulta. Nada muy complejo.

Imagen de GiGiorgio

Gracias por pasar por aquí!

Muchas gracias por tu comentario!. Saludos

Imagen de GiGiorgio

Diferencias entre hashmap y caché

Hay varias diferencia, iniciando con los servicios que estos proveen hasta la definición de los mismo. El cache, puedes definir tamaño, tiempo de vida, por ejemplo. En un Hash este tipo de definiciones no vienen "naturales". Buena pregunta. El map es algo mucho mas simple, que a mi punto de vista, resuelve un montón de cosas, de reuso, sin complicarse la vida; justo como a mi me gusta.
Saludos.