Configuración de WSJPA FastPath
La Java™ Persistence API (JPA) es una especificación muy flexible que proporciona directrices sobre cómo los implementadores van a convertir datos relacionales a un formato de objeto Java. Debido a la naturaleza flexible de esta API, una gran cantidad de trabajo se completa en el tiempo de ejecución por el proveedor de la API para determinar cómo cargar correctamente datos relacionales en formato de objeto. Esta flexibilidad genera un tiempo de ejecución que, bajo determinadas circunstancias, debe ejecutar de forma continuada código redundante para asegurarse de que los datos se han cargado correctamente. Al renunciar a parte de dicha flexibilidad, la optimización de WSJPA FastPath intenta ignorar gran parte de este código redundante y genera código altamente optimizado que interactúa directamente con la capa JDBC. Esta optimización se traduce en un mejor rendimiento.
Acerca de esta tarea
La optimización de vías de acceso de código es un proceso complejo y, como tal, no todos los modelos de dominio satisfacen los requisitos para optimizaciones de WSJPA FastPath.
La característica Fastpath puede mejorar el rendimiento de algunas aplicaciones que tienen sus datos modelados en un formato aceptable y que no utilizan características JPA ampliadas.
public Customer findCustomer(int id) {
return em.find(Customer.class, id);
}
Este ejemplo es un método auxiliar sencillo que encuentra una entidad de cliente. Cada vez que se inicia el método findCustomer, el tiempo de ejecución de JPA ejecuta grandes cantidades de código para analizar la solicitud, para acceder a la base de datos y para cargar la entidad del cliente. Si no se utiliza la optimización de FastPath, la mayor parte de la lógica es idéntica para la segunda ejecución y las subsiguientes del método findCustomer. Se conservan muy pocas de las decisiones de tiempo de ejecución de la primera ejecución para futuras invocaciones del método findCustomer. Este proceso de código redundante puede ocasionar problemas de rendimiento en algunos casos.
10855 fp_pu INFO [main] FP - Successfully generated FastPath com.ibm.ws.persistence.fastpath.entities.Customer$Find$FastPath@1f6b69d7".
Si se registra este mensaje, todas las futuras ejecuciones de buscar un cliente utilizan esta nueva vía de acceso generada.
El ejemplo anterior describe cómo ejecutar una vía de búsqueda. FastPath siempre intenta optimizar la carga poco activa de campos (relación y no relación) y la ejecución de NamedQueries.
Configuración de FastPath:
Si se ha establecido la propiedad de la unidad de persistencia wsjpa.FastPath=true, el tiempo de ejecución JPA intenta determinar qué operaciones se pueden manejar con seguridad. Las propiedades Include y Exclude se pueden utilizar para configurar explícitamente qué operaciones ejecutar con FastPath.
<property name=”openjpa.MetaDataRepository” value=”Preload=true”/>
<property name=”wsjpa.FastPath”
value=”true(Include=’<vía>;,<vía>;...’;Exclude=’<path>,<path>...’)”>
- Finder (buscador): <nombre de entidad totalmente calificado> (tal como com.ibm.ws.jpa.Customer)
- Campo cargado poco activo (Lazy): <nombre de campo totalmente cualificado> (como com.ibm.ws.jpa.Customer.cars)
- Consulta con nombre: <Nombre completo de consulta> (como com.ibm.ws.jpa.customer_find_by_id)
- Si no se especifica ninguna propiedad (Include/Exclude), el tiempo de ejecución explora todos los tipos persistentes e intenta determinar qué vías procesar.
- Si se especifica la propiedad include, sólo se procesan las vías especificadas y se ignora la propiedad exclude.
- Si se especifica la propiedad exclude, todas las vías que no estén en la lista exclude se intentan manejar.
- Si se proporciona un campo en la lista exclude, y el tipo de captación del campo es EAGER, el campo se ignora puesto que el campo nunca se cargaría de forma poco activa.
<property name="wsjpa.FastPath" value="false"/>
En este ejemplo, false es el valor predeterminado; esta optimización no
está activada por omisión.<property name="wsjpa.FastPath" value="true"/>
El tiempo de ejecución procesa todas las entidades e intenta determinar qué buscadores
(finders), qué operaciones de carga poco activa y qué consultas con nombre se pueden
optimizar.<property name="wsjpa.FastPath" value="true(Exclude=com.ibm.ws.jpa.entities.Customer.address,customer.findById"/>
Igual que en el ejemplo 2, excepto que el campo Customer.address de carga poco activa y
la consulta con nombre customer.findById se excluyen del proceso de FastPath.<property name="wsjpa.FastPath" value="true(Include=com.ibm.ws.jpa.entities.Customer, customer.findById"/>
Las únicas operaciones que se procesan son la búsqueda de un cliente (Customer) y la
ejecución de la consulta con nombre ‘customer.findById’. Todas las demás operaciones se
ejecutan utilizando el tiempo de ejecución normal de JPA.Limitaciones:
- Incompatible con la propiedad openjpa.DataCache.
- Incompatible con la propiedad openjpa.FetchPlan.
- Pasar un tipo LockModeType y/o una correlación de propiedades al método find de EntityManager.
- Estrategias de campo personalizado
@org.apache.openjpa.persistence.Factory, @javax.persistence.SecondaryTable,
@org.apache.openjpa.persistence.Externalizer,
@org.apache.openjpa.persistence.ExternalValues,
@org.apache.openjpa.persistence.LRS, @java.sql.Lob, @java.sql.Clob, @java.sql.Blo- Correlación de columnas XML
- Elementos incorporables
- Sólo se admite la herencia de una tabla.
- Devolución de llamada @javax.persistence.PostLoad
- Identificadores delimitados
- Ejecución de una vía que da como resultado:
- Obtener un campo de muchos a muchos (ManyToMany).
- Obtener una colección que se implementa como una correlación o matriz.
- Ejecución de una sentencia SQL que se une en una tabla de unión
- Ejecución de una sentencia SQL que se une en la misma tabla más de una vez, es decir, tiene una entidad que tiene varias relaciones EAGER de uno a uno con la misma entidad.
- Cargar varios niveles de relaciones eager. Como por ejemplo, {A->(eager)B->(eager)C}
- Llamar a los métodos siguientes setFirst, setFlush, setHind, setLockMode y setMax en una consulta con nombre.
- Incompatibles con las aplicaciones JPA que utilizan PureQuery.
- Incompatibles con las aplicaciones JPA que utilizan intento de acceso.
- Establecer una propiedad en el tiempo de ejecución que cambia cómo JPA capta los datos.