Este artículo describe la tecnología de almacenamiento en caché en el marco Hibernate. Compártelo para su referencia, como sigue:
El caché del marco Hibernate se divide en caché de sesión y caché de sessionFactory, también conocido como caché de nivel 1 y caché de nivel 2.
Cache de nivel 1:
El caché de nivel 1 es un caché de nivel de sesión, que tiene un ciclo de vida corto, corresponde a la sesión, es administrado por Hibernate y es un caché de toda la transacción. Cuando el programa llama al método de carga () del método get (), get (), guardar (), método saveorUpdate (), update () o método de interfaz de consulta, Hibernate en caché el objeto Entity; Cuando el objeto de entidad se consulta a través del método Load () o get (), Hibernate primero consultará en el caché. Solo cuando no se puede encontrar el objeto de entidad, Hibernate emitirá declaraciones SQL para consultar en la base de datos, mejorando así la eficiencia del uso de Hibernate.
Por ejemplo:
paquete com.xqh.util; import org.hibernate.session; import com.xqh.model.user; public class test {public static void main (string [] args) {session session = null; try {session = hibernateUtil.getSession (); // obtener sessionssion.begintransaction (); // habilitar transacciones system.out.println ("Primera consulta:"); Usuario user = (usuario) session.get (user.class, nuevo entero (1)); system.out.println ("username:" + user.getName ()); system.out.println ("segunda consulta:"); usuario user1 = (user) session.get (user.class, 1); system.println ("userneM user1.getName ()); session.getTransaction (). commit ();} catch (excepción e) {E.PrintStackTrace (); // Un error volverá a retroceder la transacción session.getTransaction (). Rollback ();} Finalmente {// Cierre el objeto de sesión Hibernateutil.Closessession (Session);}}}}Cuando el programa primero verifica el objeto de usuario a través del método get (), Hibernate emitirá una declaración SQL para consultar. En este momento, Hibernate realiza un caché de primer nivel en su objeto de usuario; Al consultar el método get () nuevamente, Hibernate no emitirá una declaración SQL porque el nombre de usuario ya existe en el caché de primer nivel. Programa de ejecución de resultados:
Primera consulta: Hibernate: SelectUser0_.id como ID0_0_, user0_.name as name0_0_, user0_.sex as sex0_0_ fromtb_user_info user0_ whereuser0_.id =? Nombre de usuario: xqhsecond Query: username: xqh
Nota: El ciclo de vida del caché de primer nivel corresponde a la sesión, y no se comparte entre las sesiones. En diferentes sesiones, no se pueden obtener los objetos de la entidad en otras sesiones.
Cache de nivel 2:
El caché de segundo nivel es un caché de nivel de sesión de session, y su ciclo de vida es consistente con SessionFactory. El caché secundario se puede compartir entre múltiples sesiones, y es un caché de todo el proceso o en todo el clúster.
El caché de nivel 2 es un complemento de caché conectable, y su uso requiere el soporte de productos de caché de terceros. En el marco Hibernate, la política de uso del caché secundario se configura a través del archivo de configuración Hibernate.
1. Agregue el archivo de configuración de caché ehcache.xml
<Ehcache> <! - Establece la ruta en el directorio donde se crean los archivos de caché .data. Si la ruta es una propiedad del sistema Java, se reemplaza por valor en la ejecución de las propiedades vmm. Las propiedades siguientes se traducen: user.home - User's Home DirectoryUser.dir - El directorio de trabajo actual del usuario.iO.TMPDIR - Ruta de archivo de temperatura predeterminada -> <diskstore diskstore Path = "java.io.tmpdir"/> <!-Configuración de caché predeterminado. Estos se aplicarán a los cachés programados creados a través del Cachemanager. Los siguientes atributos son necesarios para la Cache Default: MaxInMemory: establece el número máximo de objetos que se crearán en MemoryEternal, establece si los elementos son eternos. Si es eterno, los tiempos de espera se ignoran y la elemento nunca expiró. Solo se usa si el elemento no es eterno. El tiempo de inactividad es ahora, el último acceso TimetImetoliveSeconds, establece el tiempo para vivir para un elemento antes de que expire. Solo se usa si el elemento no es eterno. TTL ahora es-Creation TimeOverFlowTodisk-Establece si los elementos pueden desbordarse al disco cuando el Cachehas en memoria alcanzó el límite MaxInMemory .--> <DefaultCachemAxElementsInMemory = "10000" eterno = "falso" TimetoidlesEconds = "120" TimetoliveDsEnds = "120" Overflowtisk IN cachés. Agregue su configuración de configuración de caché aquí. Si no tiene una configuración para su caché, se emitirá una advertencia cuando el CacheManager inicie los siguientes atributos son necesarios para defaultcache: nombre: establece el nombre del caché. Esto se usa para identificar el caché. Debe ser único. MAXINMEMORY - Establece el número máximo de objetos que se crearán en MemoryEternal - Establece si los elementos son eternos. Si es eterno, los tiempos de espera se ignoran y la elemento nunca expiró. Solo se usa si el elemento no es eterno. El tiempo de inactividad es ahora, el último acceso TimetImetoliveSeconds, establece el tiempo para vivir para un elemento antes de que expire. Solo se usa si el elemento no es eterno. TTL ahora es-Creation TimeOverFlowTodisk-Establece si los elementos pueden desbordarse al disco cuando la caché en la memoria alcanzó el límite MaxInMemory .--> < El caché, que en esta configuración irá a donde se define java.io.tmp en su sistema. En un sistema de Linux estándar, esto será /tmp "-> <cache name =" samplecache1 "maxelementsInmemory =" 10000 "eternal =" false "timetoidleseConds =" 300 "timetoleConds =" 600 "OverflowTodisk =" true " /> <!-Cache de muestra llamado SamplecAnts Cache2 Cache2 Che000 Elements. Elementos. No caducado.
2. Establezca el archivo de configuración Hibernate.
< Cache ---> <class-cache use = "lectura de lectura"> </ssic-cache>
ejemplo:
paquete com.xqh.util; import org.hibernate.session; import com.xqh.model.user; public class test {public static void main (string [] args) {session session = null; // primera sessiontry {session = hibernateUtil.getSession (); session.begintransaction (); system.out.println ("Primera consulta:"); user user = (user) session.get (user.class, 1); system.out.println ("nombre de usuario:" + user.getName (); session.getTransaction {E.PrintStackTrace (); // Un error volverá a rodar la transacción session.getTransaction (). Rollback ();} Finalmente {// Cerrar el objeto de sesión hibernateUtil.Closesessession (sesión);} try {session = hibernateUtil.getSession (); // Habilitar el segundo caché session.beGinTransaction (); system.out.println ("Segunda consulta:"); usuario user = (user) session.get (user.class, 1); system.out.println ("username:" + user.getName (); session.getTransaction (). Commit ();} Catch (Exception e) {E.PrintstAn la transacción session.getTransaction (). Rollback ();} Finalmente {// Cierre el objeto de sesión hibernateUtil.clossession (sesión);}}}El caché secundario se comparte entre las sesiones, por lo que el mismo objeto se puede cargar en diferentes sesiones. Hibernate solo emitirá una declaración SQL. Cuando el objeto se carga por segunda vez, Hibernate obtendrá este objeto del caché.
Resultados del programa:
Primera consulta: Hibernate: SelectUser0_.id como ID0_0_, user0_.name as name0_0_, user0_.sex as sex0_0_ fromtb_user_info user0_ whereuser0_.id =? Nombre de usuario: xqhsecond Query: username: xqh
Para el caché L2, se pueden utilizar algunos datos o datos referenciados con poca frecuencia, y su rendimiento mejorará significativamente en este momento. Sin embargo, si los datos cambiados con frecuencia se usan para el caché L2, el rendimiento causará ciertos problemas.
Espero que la descripción en este artículo sea útil para la programación Java de todos en función del marco Hibernate.