Object Pool and Caching

Seguramente alguna vez hemos oído o leído sobre los conceptos de “pool de objetos” o “cache de objetos”. En este artículo quiero darles un vistazo en profundidad. Son conceptos que pueden confundirse, es por esto que intentaré resaltar las diferencias entre ambos conceptos después de haber investigado un poco.

Definiciones

Son patrones orientados a objetos muy potentes y muy usados en diferentes tecnologías, sobre todo en J2EE.

Cuando hablamos de pool, ésta se concibe como una colección de objetos sin estado. Algunos ejemplos serían una pool de conexiones a base de datos o una pool de item renderers.

En cambio, la cache se define como una colección de objetos con estado definido, por ejemplo, cuando trabajamos con servicios con una capa como puede ser Spring, los servicios se cachean.

La diferencia más importante entre estos dos conceptos está en lo que contienen, es decir, usaremos una cache cuando nos interese guardar un estado de un objeto concreto. En cambio usaremos una pool cuando necesitamos guardar objetos de los cuales no nos importa perder su estado.

Otras consideraciones importantes son:

  • Cuando pedimos un objeto de una pool, se nos puede servir cualquier objeto de esta pool.
  • En cambio, cuando pedimos un objeto de una cache, esperamos un objeto específico de esta cache.
  • Si todos los objetos de la pool están en uso cuando pedimos un elemento, esperaremos hasta que se libere cualquier objeto o se cree uno, si es necesario.
  • Si todos los objetos de la cache están en uso cuando se pide uno, tocará esperar hasta que el objeto deseado esté libre, aunque hubiera muchos elementos disponibles en la cache, ya que nos interesa uno concreto.
  • El tamaño de una pool puede variar según el número de recursos que necesitemos en un momento determinado.
  • El tamaño de una cache suele ser fijo.

Implementación

Podemos decir que la manera más habitual una cache se representa como un diccionario, es decir, como una colección de parejas id-value, de manera que cuando necesitamos un recurso determinado, éste es buscado en el diccionario y se devuelve el valor.

Para representar una pool, también podemos hacerlo con un diccionario, pero se suele crear una clase que controle los recursos, con una lógica no tan sencilla como la de una cache.

Sobre las pools

Una pool de objetos puede ofrecer una mejora de rendimiento en una aplicación. Es adecuada en aquellas situaciones en la que nos puede penalizar el proceso de creación de objetos o en las que el número de objetos de un determinado tipo puede hacer degradar el rendimiento la aplicación.

En la siguiente imagen se muestra un ejemplo típico de Pool:

pool

La pool está implementada como un singleton, el cual nos permite pedir un elemento, liberar un elemento o settear el valor máximo de elementos que la pool puede albergar.

Las pools se diferencian en tres tipos:

  • Pool sin límite: tiene un tamaño ilimitado, de manera que nos asegura que siempre devolverá un objeto cuando lo necesitemos.
  • Pool nivelada: tiene un tamaño constante. La pool se rellena durante su construcción, de manera que la carga de memoria la tenemos en tiempo de creación de la pool y no cuando se piden elementos.
  • Pool en cola: La pool tiene un tamaño mínimo y se rellena durante la construcción. No tiene límite, lo que le permite crecer. La diferencia está en que cuando pedimos un recurso de la pool y éstos están todos ocupados, la petición se pone en cola.
  • Cada aproximación de las anteriores expuestas tiene sus beneficios y depende del contexto, el uso de una o de otra.

    Conclusión

    Espero que este post haya servido para aclarar ambos conceptos. A continuación os dejo unos links interesantes sobre este tema:
    http://elromdesign.com/blog/2009/11/05/object-pooling-in-flex-actionsctipt/
    http://www.lostinactionscript.com/blog/index.php/2008/10/30/object-pooling-in-as3/

    Comparte:


    * * * * ½ 5 votos

Acerca de esta entrada