nhibernate - que - ¿qué es datos caché en un celular?
¿Cuáles son los cachés de primer y segundo nivel en hibernación? (7)
¿Alguien puede explicar con palabras simples qué es el almacenamiento en caché de primer y segundo nivel en Hibernate?
Caché de primer nivel
Hibernate intenta diferir el contexto de persistencia hasta el último momento posible. Como expliqué en este artículo , esta estrategia ha sido tradicionalmente conocida como escritura diferida transaccional.
La escritura diferida está más relacionada con el lavado de Hibernate que con cualquier transacción lógica o física. Durante una transacción, la descarga puede ocurrir varias veces.
Los cambios vaciados son visibles solo para la transacción de la base de datos actual. Hasta que se confirme la transacción actual, ningún cambio es visible por otras transacciones concurrentes.
Debido al caché de primer nivel, Hibernate puede hacer varias optimizaciones:
Caché de segundo nivel
Una solución de almacenamiento en caché adecuada tendría que abarcar varias sesiones de Hibernate y esa es la razón por la que Hibernate también admite un caché de segundo nivel adicional.
La memoria caché de segundo nivel está vinculada al ciclo de vida de SessionFactory, por lo que se destruye solo cuando se cierra SessionFactory
(normalmente cuando la aplicación se está cerrando). El caché de segundo nivel está orientado principalmente a entidades, aunque también es compatible con una solución opcional de almacenamiento en caché de consultas.
Para más detalles, echa un vistazo a este artículo .
1.1) caché de primer nivel
Caché de primer nivel siempre se asocia con el objeto Session . Hibernate usa este caché por defecto. Aquí, procesa una transacción tras otra, significa que no procesará una transacción muchas veces. Principalmente, reduce la cantidad de consultas SQL que necesita generar dentro de una transacción dada. Esto es, en lugar de actualizar después de cada modificación realizada en la transacción, se actualiza la transacción solo al final de la transacción.
1.2) caché de segundo nivel
La memoria caché de segundo nivel siempre se asocia con el objeto Session Factory . Mientras ejecuta las transacciones, mientras tanto, carga los objetos en el nivel de Session Factory, de modo que esos objetos estarán disponibles para toda la aplicación, no vinculados a un solo usuario. Dado que los objetos ya están cargados en la memoria caché, cada vez que la consulta devuelve un objeto, en ese momento no es necesario recurrir a una transacción de base de datos. De esta manera funciona el caché de segundo nivel. Aquí podemos usar el caché de nivel de consulta también.
Citado de: http://javabeat.net/introduction-to-hibernate-caching/
Aquí una explicación básica de la caché de hibernación ...
El caché de primer nivel está asociado con el objeto "sesión". El alcance de los objetos de caché es de sesión. Una vez que se cierra la sesión, los objetos almacenados en caché desaparecen para siempre. La memoria caché de primer nivel está habilitada de forma predeterminada y no puede deshabilitarla. Cuando consultamos una entidad por primera vez, se recupera de la base de datos y se almacena en el caché de primer nivel asociado con la sesión de hibernación. Si volvemos a consultar el mismo objeto con el mismo objeto de sesión, se cargará desde el caché y no se ejecutará ninguna consulta de SQL. La entidad cargada se puede eliminar de la sesión utilizando el método evict()
. La siguiente carga de esta entidad volverá a hacer una llamada a la base de datos si se ha eliminado utilizando el método evict()
. Toda la caché de la sesión se puede eliminar utilizando el método clear()
. Se eliminarán todas las entidades almacenadas en caché.
La memoria caché de segundo nivel está aparte de la memoria caché de primer nivel que está disponible para ser utilizada globalmente en el ámbito de la fábrica de sesión. el caché de segundo nivel se crea en el ámbito de la fábrica de sesiones y está disponible para ser utilizado en todas las sesiones que se crean utilizando esa fábrica de sesiones en particular. También significa que una vez que se cierra la fábrica de sesiones, toda la memoria caché asociada con él y el administrador de la memoria caché también se cierran. Siempre que la sesión de hibernación intente cargar una entidad, en el primer lugar buscará una copia en caché de la entidad en el caché de primer nivel (asociado a una sesión de hibernación en particular). Si la copia en caché de la entidad está presente en el caché de primer nivel, se devuelve como resultado del método de carga. Si no hay una entidad en caché en el caché de primer nivel, entonces se busca la caché de segundo nivel para la entidad en caché. Si el caché de segundo nivel tiene una entidad en caché, se devuelve como resultado del método de carga. Pero, antes de devolver la entidad, se almacena en la memoria caché de primer nivel también, de modo que la siguiente invocación para cargar el método para la entidad devolverá la entidad desde la memoria caché de primer nivel, y no será necesario volver a la memoria caché de segundo nivel. Si la entidad no se encuentra también en la memoria caché de primer nivel y en la memoria caché de segundo nivel, entonces la consulta de la base de datos se ejecuta y la entidad se almacena en ambos niveles de memoria caché, antes de regresar como método de respuesta de load()
.
Caché de primer nivel
El objeto de sesión contiene los datos de caché de primer nivel. Está habilitado por defecto. Los datos de caché de primer nivel no estarán disponibles para toda la aplicación. Una aplicación puede utilizar muchos objetos de sesión.
Caché de segundo nivel
El objeto SessionFactory contiene los datos de caché de segundo nivel. Los datos almacenados en el caché de segundo nivel estarán disponibles para toda la aplicación. Pero necesitamos habilitarlo explícitamente.
En un caché de segundo nivel, los archivos hbm del dominio pueden ser de clave mutable y de valor falso. Por ejemplo, en esta clase de dominio, parte de la duración en un día permanece constante como la verdad universal. Por lo tanto, se puede marcar como inmutable en toda la aplicación.
Hay una explicación bastante buena del almacenamiento en caché de primer nivel en el blog de Streamline Logic .
Básicamente, el almacenamiento en caché de primer nivel ocurre por sesión, mientras que el almacenamiento en caché de segundo nivel se puede compartir en varias sesiones.
de forma predeterminada, NHibernate utiliza el almacenamiento en caché de primer nivel que se basa en Objetos de sesión. pero si está ejecutando en un entorno multiservidor, es posible que la memoria caché de primer nivel no sea muy escalable junto con algunos problemas de rendimiento. Esto sucede debido al hecho de que tiene que hacer viajes muy frecuentes a la base de datos ya que los datos se distribuyen en varios servidores. en otras palabras, NHibernate proporciona una memoria caché L1 en proceso, no tan sofisticada, fuera de la caja. Sin embargo, no proporciona las características que una solución de almacenamiento en caché debe tener para tener un impacto notable en el rendimiento de la aplicación.
así que las preguntas de todos estos problemas es el uso de un caché L2 que está asociado con los objetos de fábrica de sesión. reduce los largos viajes a la base de datos, lo que aumenta el tiempo de respuesta de la aplicación.