El objeto de soluciones como EhCache consiste en almacenar la cache fuera del heap de Java, para evitar las pausas del Garbage Collector. Esto permite utilizar una gran cantidad de memoria para la caché, sin los inconvenientes de manejar tamaños de heap que pudieran ralentizar la ejecución.
Cualquier solución de caché tiene en cuenta las objeciones que planteas, si está bien implementada.
Lo más recomendable sería empezar por desarrollar la aplicación sin cachés externas, usando solamente las propias de la base de datos, y de los ORM (si los usas), y optimizarla (una vez que funcione correctamente) hasta que se logre el máximo rendimiento posible.
Una vez se ha llegado al máximo de sus posibilidades, si aún es imprescindible porque su rendimiento está por debajo de las expectativas, o de las necesidades,, se puede pensar en usar una solución de caché externa, del tipo de EhCache.
Hola, este es mi primer tema en estos foros, vamos a ver como nos va.
Resulta que mientras desarrollaba una aplicación web leí por ahí sobre los caches de objetos, en especial sobre ehcache y la posibilidad de integrarlo con Spring 3.1, que es el framework sobre el cual estoy trabajando, me interesó bastante el tema, ya que siempre me ha parecido una funcionalidad bastante obvia en el contexto de la POO. Sin embargo luego me di cuenta que aparte de que un cache debe mejorar le eficiencia de una aplicación, también la hace más compleja, me refiero a su mantenimiento, sobretodo si también está el tema de la concurrencia. Por lo anterior me surgieron varias preguntas:
¿Cuando es necesario aplicar un cache a una aplicación?, es decir, si se hacen consultas a una base de datos de 1000 o 2000 registros mapeados luego a sus respectivos objetos, es necesario? o estoy subestimando la capacidad de los sistemas gestores de bases de datos actuales.
¿Los caches solo son buenos cuando los objetos son inmutables? porque de otra manera ¿como garantizar la integridad del objeto en un contexto de concurrencia?. Por ejemplo, si la llamada a un método me devuelve un objeto proveniente del cache, y otros usuarios obtienen la misma instancia de este, y luego lo modifico, ¿los demás usuarios poseen ahora un objeto con los valores de sus propiedades modificadas incluso sin que estos cambios se hallan hecho persistentes en la base de datos?, y si estos sistemas de cache no devuelven la misma instancia a cada usuario sino que crean una copia o clon de este para cada uno, ¿no se estaría perdiendo el rendimiento ganado teniendo que clonar el objeto cada vez que un usuario lo solicite?.
Estas son solo algunas de las preguntas que me surgieron con este tema, la más básicas a la hora de considerar un sistema de cache en el desarrollo de una aplicación, espero que puedan ayudarme.
Saludos