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 establecer y configurar la memoria caché de datos OpenJPA, efectúe lo siguiente:
  1. Para habilitar la memoria caché de una sola JVM, establezca la propiedad openjpa.DataCache en true y establezca la propiedad openjpa.RemoteCommitProvider en sjvm:
    <property name="openjpa.DataCache" value="true"/>
    <property name="openjpa.RemoteCommitProvider" value="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.
  2. El tamaño máximo de la memoria caché se puede ajustar estableciendo la propiedad CacheSize:
    <property name="openjpa.DataCache" value="true(CacheSize=5000...
    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 SoftReferenceSize=0 ...
  3. 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'")/>
  4. 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:
    @Entity
    @DataCache(timeout=10000)
    public class Employee {
        ...
    }
    Consulte el Javadoc org.apache.openjpa.persistence.DataCache para obtener más información.
Después de configurar la memoria caché de datos, puede utilizarla para reiniciar la aplicación.
Renovar una entidad puede generar diversas reacciones en función de si se utiliza o no DataCache cuando se actualiza o se suprime el registro correspondiente en la base de datos de un proceso independiente o una parte de la misma aplicación. De manera predeterminada, las entidades se renuevan desde la base de datos cuando DataCache está activo. Por lo tanto, con la configuración predeterminada, la renovación se comporta del mismo modo con o sin DataCache. Sin embargo, se puede configurar una unidad de persistencia para renovar las actividades de DataCache con la propiedad openjpa.RefreshFromDataCache para obtener un mayor rendimiento. Con esta configuración, las modificaciones fuera de banda que se produzcan en el registro de la base de datos no aparecerán al actualizar la entidad.
Nota: A pesar de openjpa.RefreshFromDataCache ajuste, el DataCache siempre se omite para la actualización cuando los bloqueos están activos, como en el caso de una transacción pesimista, en un contexto de persistencia. Una aplicación puede activar openjpa.RefreshFromDataCache, pero aún así puede omitir DataCache al renovar una entidad, si desaloja explícitamente dicha entidad de DataCache antes de la renovación.

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.

La implementación de la memoria caché de consultas predeterminada almacena en la memoria caché 100 ejecuciones de consultas en la memoria caché menos utilizada recientemente. Esto se puede modificar estableciendo el tamaño de la memoria caché en la propiedad de plug-in CacheSize. Al igual que la antememoria de datos, la antememoria de consultas también tiene una correlación de referencias de software de respaldo que se puede modificar utilizando la propiedad SoftReferenceSize. Para mantener las consultas en la memoria caché en todo momento, puede asociarlas a una memoria caché. Para cambiar las propiedades de la memoria caché de consultas, efectúe lo siguiente:
  1. Modifique la propiedad CacheSize de openjpa.QueryCache:
    <property name="openjpa.QueryCache" value="true("CacheSize=1000, ...
  2. Cambie la propiedad SoftReferenceSize para habilitar y controlar el tamaño de esta correlación:
    <property name="openjpa.QueryCache" value="true(CacheSize=1000, SoftReferenceSize=100")/>
    La tabla SoftReferenceSize está inhabilitada por omisión. Al establecer el tamaño, éste se habilita.
  3. Asocie o desasocie consultas a la memoria caché mediante QueryResultCache utilizando esta sintaxis:
    public void pin(Query q);
    public void unpin(Query q);
Si modifica estas propiedades podrá utilizar mejor la memoria caché de consultas.
OpenJPA proporciona clases que se pueden ampliar para mejorar las funciones.
  • 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.

La memoria caché SQL de la consulta se puede configurar o inhabilitar mediante la propiedadopenjpa.jdbc.QuerySQLCache. De forma predeterminada, esta propiedad se establece en true. Cuando la propiedad se establece como true, la memoria caché se habilita y utiliza la clase org.apache.openjpa.util.CacheMap class para almacenar la memoria caché. CacheMap es una memoria caché gestionada, lo que implica que limita el número de entradas de la memoria caché y tiene un esquema de desalojo de memorias caché para gestionar el uso de memorias. Si la memoria caché se establece en true, toda la clase org.apache.openjpa.lib.util.ConcurrentHashMap se utiliza como almacenamiento en caché. ConcurrentHashMap no es una memoria caché gestionada, por lo que las entradas se mantienen en la memoria caché mientras exista la fábrica del gestor de entidades. Este mecanismo de almacenamiento en caché puede proporcionar un mejor rendimiento pero se utiliza una mayor cantidad de memoria. También se puede especificar una clase de almacenamiento en caché personalizada, siempre que implemente la interfaz java.util.Map. Para inhabilitar la memoria caché, especifique el valor false. Consulte los ejemplos siguientes sobre cómo configurar o inhabilitar la memoria caché de consultas SQL:
  • 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"/>

Qué hacer a continuación

Puede obtener más información sobre cómo almacenar en la memoria caché en OpenJPA para todas las extensiones en memoria caché en la Guía de Usuario de Apache OpenJPA.