Configuración de la memoria caché OpenJPA para mejorar el rendimiento
La implementación de OpenJPA le proporciona la opción de almacenar con frecuencia datos utilizados en la memoria para mejorar el rendimiento. OpenJPA proporciona memorias caché de datos y consultas concurrentes que permiten a las aplicaciones guardar datos de objetos persistentes y resultados de consultas en la memoria para que se compartan entre hebras y para su uso en futuras consultas.
Acerca de esta tarea
La memoria caché OpenJPA es una memoria caché de datos de objetos persistentes que funciona a nivel de EntityManagerFactory. Esta caché de uso opcional está diseñada para aumentar el rendimiento sin dejar de cumplir plenamente con el estándar Java™ Persistence API (JPA). Esto significa que cuando se habilita la opción de antememoria se puede mejorar el rendimiento de la aplicación, sin cambios en el código. La antememoria de datos OpenJPA se ha diseñado para proporcionar un rendimiento mucho mejor en las operaciones sin antememoria y garantiza un comportamiento idéntico en las operaciones habilitadas para antememoria y en las operaciones sin antememoria.
Cuando se habilita, se examina la antememoria antes de acceder al almacén de datos. La antememoria almacena los datos cuando se comprometen los objetos y cuando se cargan los objetos persistentes desde el almacén de datos. Si se opera en un único entorno de máquina virtual Java (JVM), la JVM mantiene y comparte una caché de datos entre todos EntityManager instancias obtenidas de un particular EntityManagerFactory. La memoria caché de datos OpenJPA no puede hacerlo en un entorno distribuido debido a que las memorias caché de las distintas JVM, creadas a partir de objetos EntityManagerFactory diferentes, no están sincronizadas.
Se puede utilizar la memoria caché OpenJPA
en un entorno de varias JVM configurando el plug-in de proveedor de memoria caché de segundo nivel (L2) OpenJPA. Para obtener más información, consulte el tema Proveedor de memoria caché dinámica para la memoria caché de segundo nivel JPA 2.0
y la sección Utilización del proveedor de memoria caché L2 de memoria caché dinámica en un entorno en clúster
. La configuración del plug-in DynaCache permite que el contenido de memoria caché de datos y consultas se pueda replicar de forma
coherente entre las JVM. Otras alternativas incluyen configurar un marco de notificación de eventos o usar un caché distribuido de terceros, como IBM® WebSphere® eXtreme Scale.
Se puede habilitar la memoria caché de datos de OpenJPA para entornos de una o varias JVM, establecer su tamaño de elementos predeterminado, incluyendo las referencias soft, y especificando los valores para tiempo de espera.
- Para habilitar la memoria caché de una sola JVM, establezca la propiedad
openjpa.DataCache en true y establezca la propiedad openjpa.RemoteCommitProvider
en sjvm:
Para habilitar la memoria caché en un entorno distribuido, se debe configurar openjpa.RemoteCommitProvider de forma específica para el entorno o se puede utilizar un programa de utilidad de gestión de memoria caché de terceros.<property name="openjpa.DataCache" value="true"/> <property name="openjpa.RemoteCommitProvider" value="sjvm"/> - El tamaño máximo de la memoria caché se puede ajustar estableciendo la propiedad
CacheSize:
De manera predeterminada, la memoria caché de datos OpenJPA contiene 1000 elementos. Los objetos que se asocian a la memoria caché no se cuentan cuando se determina si el tamaño de la memoria caché supera el tamaño máximo. Si se desborda la memoria caché, se desalojan los elementos aleatorios. Puede conservar los elementos desalojados durante más tiempo con la propiedad SoftReferenceSize. De manera predeterminada, las referencias de software son ilimitadas. Si es necesario, puede limitar el número de referencias de software o establecer el valor en 0 para inhabilitar por completo las referencias de software:<property name="openjpa.DataCache" value="true(CacheSize=5000...<property name="openjpa.DataCache" value="true(CacheSize=5000 SoftReferenceSize=0 ... - Puede especificar que una memoria caché se borre en determinados momentos. La
propiedad EvictionSchedule de la implementación de la memoria caché
OpenJPA acepta una planificación de desalojo de tipo cron. El formato cron especifica el
minuto, la hora del día, el día del mes y el día de la semana, comenzando por 1 para
domingo. El símbolo de asterisco (*) indica una coincidencia completa. Para planificar
una memoria caché de modo que realice el desalojo a las 3 horas y 45 minutos PM del
domingo cada mes, debe añadir esta propiedad:
<property name="openjpa.DataCache" value="true(CacheSize=5000 SoftReferenceSize=0 EvictionSchedule='15,45 * * 1'")/> - También puede especificar un valor de tiempo de espera de memoria caché para una
clase individual estableciendo la extensión de los metadatos de tiempo de espera en la
cantidad de tiempo en milisegundos que son válidos los datos de la clase; por ejemplo:
Consulte el Javadoc org.apache.openjpa.persistence.DataCache para obtener más información.@Entity @DataCache(timeout=10000) public class Employee { ... }
OpenJPA proporciona una memoria caché de consultas concurrente que permite que las aplicaciones guarden los datos de los objetos persistentes y los resultados de las consultas en la memoria para que se compartan entre las hebras y para utilizarlos en las consultas futuras. La memoria caché de consultas almacena los ID de objeto que devuelven las ejecuciones de las consultas. Cuando se ejecuta una consulta, OpenJPA ensambla una clave basándose en las propiedades de la consulta y en los parámetros utilizados durante la ejecución y comprueba si existe un resultado de la consulta almacenado en la memoria caché. Si encuentra alguno, se buscan los ID de objeto del resultado almacenado en la memoria caché y se devuelven los objetos resultantes con capacidad de persistencia. De lo contrario, la consulta se ejecuta en la base de datos y los ID de objeto que ha cargado la consulta se colocan en la memoria caché.
Puede configurar los valores de la memoria caché de consulta del mismo modo que para la memoria caché de datos. La interfaz proporcionada para la memoria caché de consultas es la clase org.apache.openjpa.persistence.QueryResultCache. Puede acceder a esta clase a través de OpenJPAEntityManagerFactory.
- Modifique la propiedad CacheSize de openjpa.QueryCache:
<property name="openjpa.QueryCache" value="true("CacheSize=1000, ... - Cambie la propiedad SoftReferenceSize para habilitar y controlar el tamaño de esta
correlación:
La tabla SoftReferenceSize está inhabilitada por omisión. Al establecer el tamaño, éste se habilita.<property name="openjpa.QueryCache" value="true(CacheSize=1000, SoftReferenceSize=100")/> - Asocie o desasocie consultas a la memoria caché mediante QueryResultCache utilizando
esta sintaxis:
public void pin(Query q); public void unpin(Query q);
- Como se ha mencionado anteriormente, si desea implementar una memoria caché distribuida que utiliza un método no soportado para comunicaciones, cree una implementación de org.apache.openjpa.event.RemoteCommitProvider.
- Si está añadiendo un comportamiento nuevo, amplíe org.apache.openjpa.datacache.DataCacheImpl.
- Para utilizar su propio mecanismo de almacenamiento, amplíe org.apache.openjpa.datacache.AbstractDataCache.
- Para añadir funciones de consulta, puede ampliar org.apache.openjpa.datacache.QueryCacheImpl por omisión.
- Implemente su propio mecanismo de almacenamiento para los resultados org.apache.openjpa.datacache.AbstractQueryCache
OpenJPA ofrece una memoria caché que proporciona el almacenamiento en caché de series SQL utilizadas por las operaciones de búsqueda que se realizan en el gestor de entidades y de algunas consultas para gestionar eficazmente las relaciones extraídas. Cuando esta memoria caché está habilitada, las consultas SQL utilizadas por estas operaciones se generan una vez por cada fábrica del gestor de entidades y se pueden reutilizar. Esta memoria caché está habilitada de manera predeterminada, pero también se puede configurar mediante la propiedad de configuración openjpa.jdbc.QuerySQLCache.
- Para utilizar una memoria caché no gestionada:
<property name="openjpa.jdbc.QuerySQLCache" value="all"/> - Para especificar una clase de memoria caché personalizada:
<property name="openjpa.jdbc.QuerySQLCache" value="com.mycompany.MyCustomCache"/> - Para utilizar una memoria caché no gestionada:
<property name="openjpa.jdbc.QuerySQLCache" value="false"/>