java jpa second-level-cache toplink-essentials

java - ¿Las entidades se almacenan en caché en jpa por defecto?



second-level-cache toplink-essentials (5)

Esto significa que mis entidades están en caché por defecto?

JPA 1.0 no define un caché L2 ("caché compartido"), JPA 1.0 solo define un caché L1 ("caché transaccional"), pero los proveedores de JPA pueden admitir un caché de objetos compartido, y la mayoría lo hace. Este es el caso de TopLink Essentials que admite el caché L1 y L2 a través de las extensiones JPA para almacenamiento en caché (por JVM).

Ahora, como se explica en el gran artículo Comprender el caché de TopLink Essentials (GlassFish JPA) :

  • Todos los EntityManagers de la misma unidad de persistencia comparten el caché de la sesión (así es como TopLink llama al caché de segundo nivel).
  • La caché de sesión está activada por defecto.
  • Si hay modificaciones / supresiones de entidades en el contexto de persistencia, se sincronizan con el caché de sesión después de que se confirme una transacción, por lo que el estado del caché de sesión se actualiza (o tal caché no sería utilizable en absoluto).

Así que debe haber algo más mal con su configuración. Puede intentar deshabilitar el caché de la sesión compartida con fines de prueba (y solo con fines de prueba) agregando la siguiente propiedad:

<property name="toplink.cache.shared.default" value="false"/>

Pero me sorprendería si esto cambia algo. Como dije, creo que hay otro problema en alguna parte.

PD: Esto no responde a la pregunta, pero si está usando GlassFish v3, ¿por qué no usa EclipseLink?

Actualización: respondiendo a un comentario del OP.

Entonces, si persisto el registro de empleados, entonces se ve en la base de datos pero no en la colección de empleados en el departamento hasta que lo agregué explícitamente a la colección de empleados. ¿Es este paso necesario?

Bueno, si no creas el enlace entre entidades en el nivel de Java, JPA no podrá crearlo en la base de datos (JPA solo hace lo que le ordenas que haga). Entonces, , debe crear el enlace y, en el caso de una asociación bidireccional, incluso debe establecer ambos lados del enlace (por ejemplo, agregue el employee a la colección de empleados del Department y el department de un Employee ).

Agrego entidad a mi base de datos y funciona bien. Pero cuando recupero la Lista, obtengo la entidad anterior, las nuevas entidades que agrego no se muestran hasta que desinstalé la aplicación y la volví a implementar. Esto significa que mis entidades están en caché por defecto? Pero, no he realizado ninguna configuración para almacenar entidades en caché en mi persistence.xml o en ningún otro archivo similar.

Incluso he intentado llamar a flush (), refresh () y merge (). Pero aun así solo muestra las antiguas entidades. ¿Me estoy perdiendo de algo? Por favor, ayúdame.


¿Estás utilizando el EntityManager? si no, inténtalo http://docs.oracle.com/javaee/5/api/javax/persistence/EntityManager.html

¿Está utilizando un DataSource para administrar las conexiones a su base de datos? Deberías intentarlo también. Es un xml que está configurado en su servidor. Da más información sobre tu arquitectura para que podamos ayudarte.


Bienvenido a JPA. Si lo usa, significa que tendrá grandes problemas si actualiza la base de datos fuera de JPA a menos que sepa lo que está haciendo y sea muy cuidadoso. Esto significa que debe averiguar cómo vaciar las entidades almacenadas en caché para que puedan volver a cargarse.

Básicamente, no actualice las entidades fuera de JPA si puede ayudarlo y si lo hace, probablemente tendrá que entrar en el funcionamiento del modelo de almacenamiento en caché utilizado por su proveedor de JPA particular. Si necesita actualizar mucho fuera de JPA, probablemente JPA no sea la opción correcta para usted.


Estoy usando el contexto de eclipselink y ejb , encontré que cuando pregunto entidades, se almacenará en caché automáticamente, pero también ejecuto una función para cambiar el registro en la base de datos, por lo que puedo obtener datos antiguos en el caché, así que deshabilito el caché agregando lo siguiente al archivo persistence.xml :

<shared-cache-mode>NONE</shared-cache-mode>

funciona!


JPA 2.0 define un caché compartido (L2), pero no especifica el valor predeterminado. EclipseLink habilita el almacenamiento en caché de forma predeterminada, otros proveedores no lo hacen.

Un EntityManager siempre tendrá un caché de contexto de persistencia (L1) hasta que llame a clear () o cree uno nuevo.

Puede deshabilitar el caché compartido,

Consulte, http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching

Pero tu problema es que no mantienes ambos lados de tu relación. Cuando configura el 1-1, debe agregarlo al 1-m, de lo contrario sus objetos no serán válidos.

Para obtener más información sobre el almacenamiento en caché, consulte

http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching