Cuando aplicar cache

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

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.

Caché

Me parece que son dos puntos interesantes que se abordan en este tema. Por una parte evitarse lecturas "no necesarias" a la base de datos. y por otra parte se habla de la integridad de los registros. Hay que entender que el Caché es un espacio en donde TEMPORALMENTE se guarda información. Considero importantes dos aspectos.

  1. Tiempo: Para nada que es recomendable mantener en memoria información que en algunmomento puede ser muy consultada pero que en determinado momento genera poco trafico.
  2. Estado: La información que cambia constantemente no es candidata a colocarse en caché. Porque entonces se tiene que dar un mantenimiento de afinidad de los datos. Por ejemplo, un caso de la vida real es que varios sistemas ocupen la misma fuente de datos y solo uno de ellos utilice el caché. Eso queire decir que si la aplicacion que si lo utiliza puede actualizar el estado de su caché y mantener de cierta forma la afinidad. ¿Pero que pasa cuando la aplicacion que no tiene caché (osea que no usa el de la otra aplicación) modifica un dato. Entonces la aplicación que si lo utiliza ya no es confiable.

    Ahora tambien falta el caché distribuido...

¿Dónde de cajón NO se debe usar caché? : En un flujo transaccional.
¿Dónde SI se puede usar caché? : En consulta de catálogos o de información que no cambie en un tiempo considerable.