Cuando llega el beneficio de la CPU de tener una memoria caché de segundo nivel de Hibernate son mayores que el golpe inicial

Paul Taylor:

Cuando llega el beneficio de la CPU de tener un objeto añadido a Hibernate segundo nivel de caché de objetos son mayores que el golpe inicial.

Actualmente estoy usando Hibernate y sin segundo nivel de caché. Esta es una aplicación para que los archivos de música procesos ( www.jthink.net/songkong ) y utiliza Hibernate para que pueda escalar con más datos, es decir, que puede procesar 100.000 canciones con poco más de memoria de 1000 canciones. Una vez que las canciones han sido procesados entonces esas canciones no son de interés (a menos que el usuario ejecuta Deshacer)

Como yo lo entiendo, si habilito segundo caché de nivel (para mi clase de canción), entonces la escritura inicial de la canción de caché utilizará más CPU entonces, si acaba de escribir en la base de datos y modificaciones adicionales al objeto canción también requerirá más recursos de la CPU. Pero su posterior recuperación de la canción de Ehcache requerirá menos recursos a continuación, recuperándolo de base de datos.

Mis canciones son procesados ​​carpeta por carpeta y pasan por una serie de etapas (en diferentes ejecutores), cuando se ponen en cola en la siguiente Ejecutor que sólo tiene que pasar las identificaciones de canciones como parámetros de lo contrario, sería utilizar una gran cantidad de memoria de almacenamiento dinámico almacenar los objetos Song sí mismos. Por eso, cuando una tarea en particular es realmente ejecuta en un ejecutor que lo primero que hace es recuperar las canciones para los documentos de identidad.

Así que no hay identificaciones de canciones particulares que se recuperan de 1000 veces, pero cada canción normalmente se escribe en entre 1 y 4 veces y recupera 10 veces. Así que si teníamos una muy pequeña caché (porque quiero mantener la memoria de pila bajo un estrecho control) que se puede esperar de las primeras carpetas a ser procesadas para tener sus canciones añadido a la caché, a continuación, ya que las canciones completas de nuevas carpetas tomarían su colocar en la memoria caché.

Pero mi pregunta es, ¿merece la pena?

Como regla general hace 10 recuperaciones frente 1-4 escrituras tiene sentido de la utilización de segundo nivel de caché, o sólo es útil si la relación es más como 100: 1?

Henri:

La verdadera respuesta es: punto de referencia Sólo ella.

Escrito a la memoria caché del montón no es tan costoso. Así que sí, incluso una vez que la recuperación de la memoria caché hará que sea más rápido que boing de nuevo a la base de datos.

Entonces, una memoria caché hace dos cosas en su mayoría en la parte superior de un HashMap. Se desaloja y expira.

Desalojo medios que ha establecido un cierto tamaño máximo de la memoria caché. Cuando esto se alcanza, la caché desalojará la entrada "más antiguo" para añadir una nueva. Existen múltiples definiciones para más antigua. Ehcache hace un muestreo de más de un conjunto de entradas y patadas fuera de la entrada al que accedió durante más tiempo en la muestra.

medios de caducidad que una entrada dada serán considerados obsoletos en algún momento. Por ejemplo, desea mantener una hora de entrada 1 antes de actualizar la entrada con el último de ellos en la base de datos. Cuando se obtiene una entrada, Ehcache busca en primer lugar si ha caducado la entrada. Si es así, se volverá nula y eliminar la entrada de la caché. Esto significa que una entrada expirado permanecerá en la memoria caché hasta que se intenta acceder a él.

En su caso, tendrá que cargar la entrada de una vez. Entonces tenerlo en la memoria caché. Usarlo y finalmente eliminarlo para ahorrar memoria. Si usted tiene un paso final en el que sabe que no va a necesitar la entrada más, basta con retirar allí.

Si no lo hace, tendrá que depender de desalojo. Debido a que el algoritmo de desalojo eliminará entradas caducadas primera (¿por qué la eliminación de una entrada perfectamente válido si se puede quitar uno caducado?).

Usted debe calcular la cantidad de tiempo de una entrada debe permanecer en la memoria caché de pasar por todos los ejecutores. Esta será su tiempo de caducidad (TTL). A continuación, cambia el tamaño de la caché más o menos a NB_EXECUTORS * NB_STEPS. A continuación, será el tamaño de las canciones utilizadas actualmente. Cuando se añade una nueva canción, la caché tendrá que desalojar a una entrada de edad. En la mayoría de los casos, esta entrada será vencido por lo que no hay daño.

Para evitar el desalojo (que puede ser costoso al no encontrar una entrada expirado), puede codificar una rutina de fondo que recibe entradas. Se disparará caducidad. Pero, de nuevo, no lo haga antes de estar seguros de que, utilizando un punto de referencia, que en realidad es más rápido.

Por último, es posible que desee almacenar en caché una canción directamente en lugar de utilizar el nivel de hibernación 2. Debido a que requiere menos operaciones para obtener la canción. También, cuando se escribe una entrada que estaba en la memoria caché de segundo nivel, Hibernate tienden a desalojar de la caché. Asegúrese de configurar a no hacer eso.

Una nota acerca de la modificación. Por defecto Ehcache caché en el montón (y sólo en el montón de caché) es por referencia. Así que si recupera un objeto de la Canción de la memoria caché y luego modificarlo, la entrada en la caché se modifica, así, ya que en realidad es el único ejemplo.

Sin embargo, eso no es cómo funciona la caché de segundo nivel de Hibernate. Se pueden conservar en la memoria caché algún tipo de fila de base de datos. Esto se convierte en la canción y se le devolverá.

Al guardar la canción en la base de datos, Hibernate lo sacará de la caché como decía más arriba (pero es posible pedir una actualización de la memoria caché en la configuración, no estoy seguro de eso).

Es por eso que creo que debería almacenar en caché directamente en lugar de utilizar la memoria caché de segundo nivel. Sin embargo, tenga cuidado porque se obtiene un objeto cargado por Hibernate. Es necesario para separarla de hibernación antes de ponerlo en la memoria caché. Y luego adjuntarlo en el nuevo ejecutor. De lo contrario, si usted tiene colecciones, por ejemplo, cosas extrañas pueden suceder.

Ahora, suponiendo que se desea actualizar la memoria caché y la base de datos cada vez. Tienes dos formas de hacerlo.

Con Cache-lado, actualizará la base de datos a continuación, actualizar la memoria caché.

Con Cache-a través, actualizará la memoria caché que se encargará (atomitacally) de actualizar la base de datos. Cache-a través es un poco más complicado ya que se necesita para proporcionar una CacheLoaderWriterimplementación. Pero se asegura la caché y la base de datos están siempre sincronizados.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=181308&siteId=1
Recomendado
Clasificación