{"id":437,"date":"2009-03-14T23:06:05","date_gmt":"2009-03-14T23:06:05","guid":{"rendered":"https:\/\/www.viafirma.com\/blog-xnoccio\/?p=437"},"modified":"2026-01-23T11:40:50","modified_gmt":"2026-01-23T11:40:50","slug":"implementando-una-cache-sencilla-de-objetos-con-ehcache","status":"publish","type":"post","link":"https:\/\/www.viafirma.com\/es\/implementando-una-cache-sencilla-de-objetos-con-ehcache\/","title":{"rendered":"Ehcache: Implementar cach\u00e9 sencilla de objetos"},"content":{"rendered":"\r\n<p>Recientemente, desde <a href=\"https:\/\/www.viafirma.com\/es\/\">Viafirma<\/a> hemos revisado la arquitectura t\u00e9cnica de un proyecto Java EE que estaba teniendo problemas de escalabilidad. En Desarrollo todo iba correctamente, pero con un n\u00famero importante de registros (apenas 100.000) hab\u00eda tiempos de respuesta que se pod\u00edan ir a los 5 minutos. Son tiempos no admisibles, por lo que urg\u00eda detectar fuentes de problemas y optimizar los procesos.<\/p>\r\n<h2>Problema de estabilidad y soluci\u00f3n con Ehcache<\/h2>\r\n\r\n\r\n\r\n<p>El problema no era un c\u00f3digo defectuoso, sino una implementaci\u00f3n extremadamente flexible que permit\u00eda al usuario realizar b\u00fasquedas complejas que implicaban grandes vol\u00famenes de consultas y operaciones sobre listas. Desde filtrados a operaciones de uni\u00f3n\/intersecci\u00f3n de listas enormes, pasando por persistencia, etc. Muchas de estas listas, como las de datos geogr\u00e1ficos (por ejemplo, provincias), no cambiaban frecuentemente, por lo que resultaba \u00f3ptimo implementar una cach\u00e9 de objetos.<\/p>\r\n<p>Decidimos utilizar <a href=\"https:\/\/www.ehcache.org\/\" target=\"_blank\" rel=\"noopener\">Ehcache<\/a> debido a su facilidad de integraci\u00f3n con <a href=\"https:\/\/hibernate.org\/\" target=\"_blank\" rel=\"noopener\">Hibernate<\/a>, que ya hac\u00eda uso de este. Adem\u00e1s, Ehcache ofrece m\u00faltiples ventajas funcionales, como la gesti\u00f3n autom\u00e1tica de la caducidad de los objetos cacheados y la capacidad de manejar grandes vol\u00famenes de datos serializados en disco, lo que lo hace ideal para mejorar el rendimiento de una aplicaci\u00f3n Java EE.<\/p>\r\n\r\n\r\n\r\n<h3>Ventajas de usar Ehcache<\/h3>\r\n\r\n\r\n\r\n<ol class=\"wp-block-list\">\r\n<li>\r\n<p><strong>Gesti\u00f3n de caducidad<\/strong>: Ehcache elimina autom\u00e1ticamente los objetos cacheados despu\u00e9s de un tiempo predefinido, devolviendo <code>NULL<\/code> cuando la cach\u00e9 expira.<\/p>\r\n<\/li>\r\n<li>\r\n<p><strong>Control del n\u00famero de objetos<\/strong>: Permite configurar la cantidad de objetos almacenados en memoria. Si se supera el l\u00edmite, Ehcache serializa los objetos adicionales a disco, gestionando eficientemente los recursos.<\/p>\r\n<\/li>\r\n<li>\r\n<p><strong>Compatibilidad con Clustering<\/strong>: Ehcache soporta configuraciones distribuidas, lo que permite el uso en entornos de <strong>cluster<\/strong>.<\/p>\r\n<\/li>\r\n<li>\r\n<p><strong>Eliminaci\u00f3n de cach\u00e9 en el shutdown<\/strong>: Ehcache elimina la cach\u00e9 de manera controlada durante el apagado del servidor de aplicaciones.<\/p>\r\n<\/li>\r\n<li>\r\n<p><strong>\u00a1No reinventar la rueda<\/strong>!<\/p>\r\n<\/li>\r\n<\/ol>\r\n\r\n\r\n\r\n<h2>Implementaci\u00f3n de una Cach\u00e9 con Ehcache<\/h2>\r\n<p>Desarrollamos una sencilla clase de tipo Manager, siguiendo el patr\u00f3n Singleton, que interact\u00faa con Ehcache para almacenar y recuperar objetos en cach\u00e9 que anteriormente se generaban online. El resultado fue una optimizaci\u00f3n impresionante: operaciones que antes tardaban 5 minutos pasaron a ejecutarse en menos de 10 segundos, logrando una mejora de m\u00e1s del 3000% en rendimiento.<\/p>\r\n<p>Aqu\u00ed te dejo un fragmento del c\u00f3digo de la clase <code>CacheUtil<\/code> para implementar esta cach\u00e9:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code><code style=\"max-width: 100%; display: block;\">\r\n\/*\r\n\r\n* File: CacheUtil.java\r\n\r\n*\r\n\r\n* Created on march 2009\r\n\r\n*\r\n\r\n*\r\n\r\n* Copyright 2006-2029 Javier Echeverr\u00eda Us\u00faa (javieu at gmail.com)\r\n\r\n*\r\n\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n\r\n* you may not use this file except in compliance with the License.\r\n\r\n* You may obtain a copy of the License at\r\n\r\n*\r\n\r\n*     http:\/\/www.apache.org\/licenses\/LICENSE-2.0\r\n\r\n*\r\n\r\n* Unless required by applicable law or agreed to in writing, software\r\n\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n\r\n* See the License for the specific language governing permissions and\r\n\r\n* limitations under the License.\r\n\r\n*\r\n\r\n*\/\r\n\r\npackage com.viavansi.framework.core.cache<\/code><\/code><\/pre>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>import net.sf.ehcache.Cache;<br \/>import net.sf.ehcache.CacheManager;<br \/>import net.sf.ehcache.Element;<\/code><\/pre>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>import org.apache.commons.logging.Log;<br \/>import org.apache.commons.logging.LogFactory;<\/code><\/pre>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>import com.viavansi.framework.core.persistencia.servicios.excepciones.ExcepcionServicio;<\/code><\/pre>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>\/**<br \/>* @author Javier Echeverria Usua (javieu at gmail.com)<br \/>* @author Felix Garcia Borrego (borrego at gmail.com)<br \/>* @author Alexis Castilla Armero (pencerval at gmail.com)<br \/>*\/<br \/>public class CacheUtil {<\/code><\/pre>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>public Object getCachedObject(String key) throws Exception{<\/code><\/pre>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>if(minutosVidaDefault == 0)<br \/>minutosVidaDefault = MINUTOS_DEFAULT;<\/code><\/pre>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>return getCachedObject(key, minutosVidaDefault);<br \/>}<\/code><\/pre>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>public void putCachedObject(String key, Object info) throws Exception{<\/code><\/pre>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>if(minutosVidaDefault == 0)<br \/>minutosVidaDefault = MINUTOS_DEFAULT;<\/code><\/pre>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>putCachedObject(key, info, minutosVidaDefault);<br \/>}<\/code><\/pre>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>public Object getCachedObject(String key, int minutosCache) throws Exception{<\/code><\/pre>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>Cache cacheCustodia = getInstance(minutosCache);<br \/>Element element = cacheCustodia.get(key);<br \/>if(element != null){<br \/>return cacheCustodia.get(key).getValue();<br \/>}<br \/>else{<br \/>return null;<br \/>}<br \/>}<\/code><\/pre>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>public void putCachedObject(String key, Object info, int minutosCache) throws Exception{<\/code><\/pre>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>Cache cacheCustodia = getInstance(minutosCache);<br \/>cacheCustodia.put(new Element(key,info));<br \/>}<\/code><\/pre>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>private Cache getInstance(int minutosCache) {<br \/>Cache cache = null;<br \/>\/\/Todav\u00eda no existe<br \/>int timeTolife = minutosCache * 60;<\/code><\/pre>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>CacheManager manager = CacheManager.getInstance();<\/code><\/pre>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>String nombreCache = \"viavansiCachedInfo\" + minutosCache;<\/code><\/pre>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>if (manager.cacheExists(nombreCache)) {<br \/>cache = manager.getCache(nombreCache);<br \/>} else {<br \/>\/\/ Configuramos el apagado en caso de Error de la JVM o parada inesperada.<br \/>System.setProperty(\"net.sf.ehcache.enableShutdownHook\", \"true\");<br \/>manager.addCache(new Cache(nombreCache, 100, true, false, timeTolife, timeTolife));<br \/>cache = manager.getCache(nombreCache);<br \/>}<\/code><\/pre>\r\n\r\n\r\n\r\n<p>return cache;<br \/>}<\/p>\r\n\r\n\r\n\r\n<p>public static void shutDown() {<br \/>CacheManager.getInstance().shutdown();<br \/>}<\/p>\r\n\r\n\r\n\r\n<p>private int MINUTOS_DEFAULT = 60;<\/p>\r\n\r\n\r\n\r\n<p>private static int minutosVidaDefault = 0;<\/p>\r\n\r\n\r\n\r\n<p>protected CacheUtil(int minutosVida) {<br \/>minutosVidaDefault = minutosVida;<br \/>}<\/p>\r\n\r\n\r\n\r\n<p>public static void init(int minutosVida) {<br \/>minutosVidaDefault = minutosVida;<br \/>}<\/p>\r\n\r\n\r\n\r\n<p>\/*<br \/>* Constructor y accesores<br \/>*\/<\/p>\r\n\r\n\r\n\r\n<p>\/\/ Patr\u00f3n Singleton<br \/>private static CacheUtil singleton;<\/p>\r\n\r\n\r\n\r\n<p>\/\/Instancia de Commons Logging<br \/>private Log log = LogFactory.getFactory().getInstance(this.getClass().getName());<\/p>\r\n\r\n\r\n\r\n<p>\/**<br \/>* private constructor (solo una instancia).<br \/>* @return AmbitoBO<br \/>*\/<br \/>protected CacheUtil() throws ExcepcionServicio {<br \/>super();<br \/>log.debug(\u00abCreando nueva instancia de CacheUtil\u00bb);<br \/>}<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code><code>\/**<br \/>\r\n* Devuelve instancia activa de AmbitoBO.<br \/>\r\n* T\u00edpico m\u00e9todo de implementaci\u00f3n de patr\u00f3n singleton<br \/>\r\n* @return AmbitoBO<br \/>\r\n* @throws ExcepcionServicio<br \/>\r\n*\/<br \/>\r\npublic static CacheUtil getCurrentInstance() throws ExcepcionServicio {<br \/>\r\nif (singleton == null) {<br \/>\r\ntry {<br \/>\r\nsingleton = new CacheUtil();<br \/>\r\n} catch (ExcepcionServicio e) {<br \/>\r\nthrow e;<br \/>\r\n}<br \/>\r\n}<br \/>\r\nreturn singleton;<br \/>\r\n}<br \/>\r\n}<br \/>\r\n<\/code><br \/>Un saludo a todos, y poned una cach\u00e9 en vuestros corazones :-P<br \/><br \/><\/code><\/pre>\r\n<p><\/p>\r\n<p><span style=\"font-weight: 400;\"><div class=\"vf_related_posts_wrapper\"><h2 class=\"vf_related_posts_title\">Informaci\u00f3n relacionada<\/h2><div class=\"vf_related_posts\"><article class=\"vc_gitem-post-data-source-post\"><a href=\"https:\/\/www.viafirma.com\/es\/5-consejos-basicos-para-mejorar-la-ciberseguridad-en-tu-empresa\/\"><div class=\"vc_gitem-post-image\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"475\" src=\"https:\/\/www.viafirma.com\/wp-content\/uploads\/2018\/08\/blog_consejos_ciber-768x475.webp\" class=\"attachment-medium_large size-medium_large wp-post-image\" alt=\"5 consejos b\u00e1sicos para mejorar la ciberseguridad en tu empresa\" srcset=\"https:\/\/www.viafirma.com\/wp-content\/uploads\/2018\/08\/blog_consejos_ciber-768x475.webp 768w, https:\/\/www.viafirma.com\/wp-content\/uploads\/2018\/08\/blog_consejos_ciber-300x186.webp 300w, https:\/\/www.viafirma.com\/wp-content\/uploads\/2018\/08\/blog_consejos_ciber-1024x634.webp 1024w, https:\/\/www.viafirma.com\/wp-content\/uploads\/2018\/08\/blog_consejos_ciber.webp 1228w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/div><\/a><div class=\"vc_gitem-post-data\"><h3 class=\"vc_gitem-post-data-source-post_title\"><a href=\"https:\/\/www.viafirma.com\/es\/5-consejos-basicos-para-mejorar-la-ciberseguridad-en-tu-empresa\/\">5 consejos b\u00e1sicos para mejorar la ciberseguridad en tu empresa<\/a><\/h3><p>Cinco consejos b\u00e1sicos para mejorar la ciberseguridad<\/p><\/div><\/article><article class=\"vc_gitem-post-data-source-post\"><a href=\"https:\/\/www.viafirma.com\/es\/como-aprenden-las-maquinas\/\"><div class=\"vc_gitem-post-image\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"475\" src=\"https:\/\/www.viafirma.com\/wp-content\/uploads\/2017\/08\/blog_robots-768x475.webp\" class=\"attachment-medium_large size-medium_large wp-post-image\" alt=\"\u00bfC\u00f3mo aprenden las m\u00e1quinas?\" srcset=\"https:\/\/www.viafirma.com\/wp-content\/uploads\/2017\/08\/blog_robots-768x475.webp 768w, https:\/\/www.viafirma.com\/wp-content\/uploads\/2017\/08\/blog_robots-300x186.webp 300w, https:\/\/www.viafirma.com\/wp-content\/uploads\/2017\/08\/blog_robots-1024x634.webp 1024w, https:\/\/www.viafirma.com\/wp-content\/uploads\/2017\/08\/blog_robots.webp 1228w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/div><\/a><div class=\"vc_gitem-post-data\"><h3 class=\"vc_gitem-post-data-source-post_title\"><a href=\"https:\/\/www.viafirma.com\/es\/como-aprenden-las-maquinas\/\">\u00bfC\u00f3mo aprenden las m\u00e1quinas?<\/a><\/h3><p>C\u00f3mo aprenden las m\u00e1quinas: conceptos clave<\/p><\/div><\/article><article class=\"vc_gitem-post-data-source-post\"><a href=\"https:\/\/www.viafirma.com\/es\/mitos-sobre-firma\/\"><div class=\"vc_gitem-post-image\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"475\" src=\"https:\/\/www.viafirma.com\/wp-content\/uploads\/2025\/06\/010725_blog_firmaelectronica-768x475.webp\" class=\"attachment-medium_large size-medium_large wp-post-image\" alt=\"Persona firmando un documento en una tablet, ilustrando mitos sobre firma electronica y su validaci\u00f3n\" srcset=\"https:\/\/www.viafirma.com\/wp-content\/uploads\/2025\/06\/010725_blog_firmaelectronica-768x475.webp 768w, https:\/\/www.viafirma.com\/wp-content\/uploads\/2025\/06\/010725_blog_firmaelectronica-300x186.webp 300w, https:\/\/www.viafirma.com\/wp-content\/uploads\/2025\/06\/010725_blog_firmaelectronica-1024x634.webp 1024w, https:\/\/www.viafirma.com\/wp-content\/uploads\/2025\/06\/010725_blog_firmaelectronica.webp 1228w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/div><\/a><div class=\"vc_gitem-post-data\"><h3 class=\"vc_gitem-post-data-source-post_title\"><a href=\"https:\/\/www.viafirma.com\/es\/mitos-sobre-firma\/\">5 Mitos sobre firma electr\u00f3nica y digital<\/a><\/h3><p>Desmontamos 5 mitos comunes en la materia<\/p><\/div><\/article><\/div><\/div><\/span><\/p>","protected":false},"excerpt":{"rendered":"Implementa una cach\u00e9 en Java con EHCache...","protected":false},"author":1,"featured_media":35658,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"default","adv-header-id-meta":"","stick-header-meta":"default","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[40],"class_list":["post-437","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-miscelanea"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.viafirma.com\/es\/wp-json\/wp\/v2\/posts\/437","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.viafirma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.viafirma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.viafirma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.viafirma.com\/es\/wp-json\/wp\/v2\/comments?post=437"}],"version-history":[{"count":3,"href":"https:\/\/www.viafirma.com\/es\/wp-json\/wp\/v2\/posts\/437\/revisions"}],"predecessor-version":[{"id":97655,"href":"https:\/\/www.viafirma.com\/es\/wp-json\/wp\/v2\/posts\/437\/revisions\/97655"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.viafirma.com\/es\/wp-json\/wp\/v2\/media\/35658"}],"wp:attachment":[{"href":"https:\/\/www.viafirma.com\/es\/wp-json\/wp\/v2\/media?parent=437"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.viafirma.com\/es\/wp-json\/wp\/v2\/categories?post=437"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}