2010-12-14 24 views

Respuesta

0

Si Hibernate es algo similar a NHibernate (que es, excepto al revés), el Session es el caché de primer nivel. Excepto que no es un caché en un sentido general, sino más bien un mapa de identidad.

2

En JPA/Hibernate (y otras herramientas ORM similares), la memoria caché L1 es la memoria caché transaccional, es decir, las entidades almacenadas desde cuando abre una transacción a cuando la cierra. Esto casi nunca es una caché compartida (otros hilos no pueden hacer uso de ella). En JPA, esto normalmente lo detenta el EntityManager.

La memoria caché L2 es una memoria caché completa (normalmente) compartida. Si tiene varios subprocesos/consultas que extraen datos, entonces pueden hacer uso de entidades que ya han sido recuperadas por otros subprocesos que todavía están activos en el caché. En JPA, esto normalmente se llevaría a cabo por EntityManagerFactory.

1

GaryF no está mal, pero no es técnicamente correcta :-) Anton es más correcto en esto, pero para complementar su respuesta:

Primer Nivel caché: este es un "caché" que almacena todas las entidades conocidas por una sesión específica. Entonces, si tiene 3 transacciones dentro de esta sesión, contendrá todas las entidades afectadas por las tres transacciones. Se borra cuando cierra la sesión o cuando realiza el método "borrar".

caché de segundo nivel: se trata de una caché "real" y se delega a un proveedor externo, como Infinispan. En esta memoria caché, usted tiene control total sobre el contenido de la memoria caché, lo que significa que puede especificar qué entradas se deben desalojar, cuáles se deben conservar más tiempo, etc.

+0

para el primer nivel de caché, lo que sucede cuando la caché está llena? Mencionó dos casos en los que se borra la caché, pero estoy bastante seguro de que se borrará automáticamente de acuerdo con un algoritmo "último usado" o similar cuando la caché se llene. De lo contrario, se produciría una excepción de falta de memoria o no se almacenaría nada en la memoria caché después de ese punto. – KyleM

+0

Es posible que desee comprobar esto con la documentación o experimentando usted mismo, pero por lo que recuerdo, las entradas en el caché de primer nivel nunca son desalojadas. Por lo tanto, si tiene una transacción que afecta a una gran cantidad de datos, es posible que enfrente una excepción de falta de memoria (como en las operaciones por lotes). Para este caso de "borde", es posible que desee utilizar un StatelessSession (http://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/StatelessSession.html). – jpkrohling

8

de caché L1 es el caché que existe por sesión de Hibernate, y esto caché no se comparte entre los hilos. Esta memoria caché utiliza el propio almacenamiento en caché de Hibernate.

L2 Cache es una caché que sobrevive más allá de una sesión de Hibernate, y pueden ser compartidos entre los hilos. Por esta caché se puede utilizar una aplicación de almacenamiento en caché que viene con Hibernate como EHCache o algo que se le parezca JBossCache2

Cuestiones relacionadas