Configuration de WSJPA FastPath
L'API JPA (Java™ Persistence API) est une spécification très souple qui indique aux implémenteurs de convertir les données relationnelles sous la forme d'un objet Java. Compte tenu de cette souplesse, la majorité du travail est exécuté lors de l'exécution par le fournisseur de l'API pour déterminer la manière de charger correctement les données relationnelles sous la forme d'un objet. De cette souplesse découle une exécution qui, dans certains cas, doit exécuter en continu du code redondant pour que les données soient correctement chargées. En abandonnant une partie de cette flexibilité, l'optimisation WSJPA FastPath tente d'ignorer la majorité du code redondant et génère du code hautement optimisé qui interagit directement avec la couche JDBC. Cette optimisation conduit à une amélioration des performances.
Pourquoi et quand exécuter cette tâche
L'optimisation de ces chemins de code est un processus complexe et, par conséquent, les modèles de domaine ne répondent pas tous aux exigences des optimisations WSJPA FastPath.
La fonction Fastpath peut améliorer les performances de certaines applications dont les données sont modélisées dans un format acceptable et qui n'utilisent pas de fonctions JPA étendues.
public Customer findCustomer(int id) {
return em.find(Customer.class, id);
}
Cet exemple est une méthode auxiliaire simple qui recherche une entité client. Chaque fois que la méthode findCustomer est appelée, l'exécution JPA exécute de grandes quantités de code pour analyser la demande, accéder à la base de données et charger l'entité client. Sans l'optimisation FastPath, la majorité de la logique est identique pour la deuxième exécution et les exécutions suivantes de la méthode findCustomer. Un très petit nombre de décisions d'exécution de la première exécution sont conservées pour les appels suivants de la méthode findCustomer. Ce traitement du code redondant peut générer des problèmes de performance dans certains scénarios.
10855 fp_pu INFO [main] FP - Successfully generated FastPath com.ibm.ws.persistence.fastpath.entities.Customer$Find$FastPath@1f6b69d7".
Lorsque le message est consigné, toutes les exécutions suivantes de recherche d'un client utilisent le nouveau chemin généré.
L'exemple suivant explique comment exécuter un chemin de recherche. FastPath tente également d'optimiser le lazy loading des zones (relation et non-relation) et d'exécuter NamedQueries.
Configuration FastPath :
Lorsque la propriété d'unité de persistance wsjpa.FastPath=true est définie, l'exécution JPA tente de déterminer les opérations qui peuvent être exécutées en toute sécurité. Les propriétés Include et Exclude peuvent être utilisées pour configurer explicitement les opérations exécutées en utilisant FastPath.
<property name=”openjpa.MetaDataRepository” value=”Preload=true”/>
<property name=”wsjpa.FastPath”
value=”true(Include=’<path>;,<path>;...’;Exclude=’<path>,<path>...’)”>
- Outil de recherche : <nom d'entité qualifié complet> (tel que com.ibm.ws.jpa.Customer)
- Zone avec lazy loading : <nom de zone qualifié complet> (tel que com.ibm.ws.jpa.Customer.cars)
- Requête nommée : <nom de requête complet> (telle que com.ibm.ws.jpa.customer_find_by_id)
- Si aucune propriété (Include/Exclude) n'est définie, l'exécution balaye tous les types persistants et tente de déterminer les chemins pouvant être traités.
- Si la propriété Include est définie est définie, seuls les chemins spécifiés sont traités et la propriété Exclude est ignorée.
- Si la propriété Exclude est définie, tous les chemins qui ne figurent pas dans la liste d'exclusion tentent d'être traités.
- Si la liste d'exclusion contient une zone et que le type de recherche de la zone est EAGER, la zone est ignorée, car elle ne fera jamais l'objet d'un lazy loading.
<property name="wsjpa.FastPath" value="false"/>
Dans cet exemple, false est la valeur par défaut ; cette optimisation n'est pas retournée par défaut.<property name="wsjpa.FastPath" value="true"/>
L'exécution traite toutes les entités et tente de déterminer les outils de recherche, les opérations lazy load et les requêtes nommées qui peuvent être optimisées.<property name="wsjpa.FastPath" value="true(Exclude=com.ibm.ws.jpa.entities.Customer.address,customer.findById"/>
Comme dans l'exemple 2, à l'exception du lazy loading, la zone Customer.address et la requête nommée customer.findById sont exclus du traitement FastPath.<property name="wsjpa.FastPath" value="true(Include=com.ibm.ws.jpa.entities.Customer, customer.findById"/>
Les seules opérations traitées sont la recherche d'un client et l'exécution de la requête nommée ‘customer.findById’. Toutes les autres opérations sont exécutées en utilisant l'exécution JPA normale.Limitations :
- Incompatible avec la propriété openjpa.DataCache
- Incompatible avec la propriété openjpa.FetchPlan
- Envoi d'un type de mode de verrouillage LockModeType et/ou d'une mappe de propriétés à la méthode de recherche EntityManager.
- Stratégies de zone personnalisées
@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- Mappage de colonnes XML
- Incorporables
- Seul l'héritage de table unique est pris en charge.
- @javax.persistence.PostLoad callback
- Identificateurs délimités
- Exécution d'un chemin qui provoque :
- la recherche d'une zone ManyToMany
- la recherche d'une collection implémentée comme mappe ou matrice
- Exécution d'une instruction SQL qui génère une jointure dans une table de jointures
- Exécution d'une instruction SQL qui produit une jointure plusieurs fois dans la même table de jointures. Par exemple : entité ayant plusieurs relations EAGER OneToOne avec la même entité.
- Chargement de plusieurs niveaux de relations eager. Par exemple {A->(eager)B->(eager)C}
- Appel des méthodes suivants setFirst, setFlush, setHind, setLockMode et setMax dans une requête nommée NamedQuery.
- Incompatible avec les applications JPA qui utilisent PureQuery.
- Incompatible avec les applications JPA qui utilisent la tentative d'accès.
- Définition d'une propriété lors de l'exécution qui change le mode de recherche des données par JPA.