WSJPA-FastPath konfigurieren
Die Spezifikation JPA (Java™ Persistence API) ist eine sehr flexible Spezifikation, die Richtlinien dafür bereitstellt, wie Implementierer die relationalen Daten in ein Java-Objektformat konvertieren müssen. Aufgrund der flexiblen Natur dieser API wird ein großer Teil des Arbeitsaufwandes während der Laufzeit vom API-Provider ausgeführt, um zu ermitteln, wie relationale Daten ordnungsgemäß in ein Objektformat geladen werden. Diese Flexibilität resultiert in einer Laufzeit, die unter bestimmten Umständen fortlaufend redundanten Code ausführen muss, um sicherzustellen, dass die Daten richtig geladen wurden. Indem Sie einen Teil dieser Flexibilität aufgibt, versucht die WSJPA-FastPath-Optimierung, viel von diesem redundanten Code zu überspringen und generiert stark optimierten Code, der direkt mit der JDBC-Schicht interagiert. Aufgrund dieser Optimierung wird eine bessere Leistung erzielt.
Informationen zu diesem Vorgang
Die Optimierung dieser Codepfade ist ein komplexer Prozess, und nicht alle Domänenmodelle erfüllen die Anforderungen für WSJPA-FastPath-Optimierungen.
Das Fastpath-Feature kann die Leistung einiger Anwendungen, deren Daten in einem akzeptablen Format modelliert sind und die keine erweiterten JPA-Funktionen verwenden, verbessern.
public Customer findCustomer(int id) {
return em.find(Customer.class, id);
}
Dieses Beispiel ist eine einfache Helper-Methode zum Auffinden der Entität "Customer" (Kunde). Jedes Mal, wenn die Methode "findCustomer" gestartet wird, führt die JPA-Laufzeit große Mengen an Code aus, um die Anforderung zu analysieren, auf die Datenbank zuzugreifen, und die Entität "Customer" (Kunde) zu laden. Ohne Verwendung der FastPath-Optimierung ist ein Großteil der Logik für die zweite und die nachfolgenden Ausführungen der Methode "findCustomer" identisch. Sehr wenige Laufzeitentscheidungen aus der ersten Ausführung werden für künftige Aufrufe der Methode "findCustomer" beibehalten. Diese redundante Codeverarbeitung kann in einigen Szenarien zu Leistungsproblemen führen.
10855 fp_pu INFO [main] FP - Successfully generated FastPath com.ibm.ws.persistence.fastpath.entities.Customer$Find$FastPath@1f6b69d7".
Wenn diese Nachricht protokolliert wird, verwenden alle künftigen Ausführungen zum Auffinden eines Kunden (Customer) diesen neu generierten Pfad.
Im vorherigen Beispiel wurde gezeigt, wie ein Finder-Pfad ausgeführt werden kann. FastPath versucht auch, das Nachladen (Lazy Load) von Feldern (Beziehung und Nicht-Beziehung) und die Ausführung von benannten Abfragen (NamedQueries) zu optimieren.
FastPath konfigurieren:
Wenn die Eigenschaft der Persistenzeinheit wsjpa.FastPath=true gesetzt ist, versucht die JPA-Laufzeit zu bestimmen, welche Operationen sicher ausgeführt werden können. Mit den Eigenschaften "Include" (Einschließen) und "Exclude" (Ausschließen) kann explizit konfiguriert werden, welche Operationen mit FastPath ausgeführt werden sollen.
<property name=”openjpa.MetaDataRepository” value=”Preload=true”/>
<property name=”wsjpa.FastPath”
value=”true(Include=’<path>;,<path>;...’;Exclude=’<Pfad>,<Pfad>...’)”>
- Finder: <Vollständig qualifizierter Entitätsname> (z. B. com.ibm.ws.jpa.Customer)
- Nachgeladenes Feld (Lazy Load): <Vollständig qualifizierter Feldname> (z. B. com.ibm.ws.jpa.Customer.cars)
- Benannte Abfrage: <Vollständiger Abfragename> (z. B. com.ibm.ws.jpa.customer_find_by_id)
- Werden keine Eigenschaften (Include/Exclude) angegeben, prüft die Laufzeit alle persistenten Typen und versucht zu bestimmen, welche Pfade verarbeitet werden können.
- Wenn die Eigenschaft "Include" angegeben wird, werden nur die angegebenen Pfade verarbeitet und die Eigenschaft "Exclude" wird ignoriert.
- Wenn die Eigenschaft "Exclude" angegeben ist, wird versucht, alle Pfade zu verarbeiten, die nicht in der Ausschlussliste enthalten sind.
- Wenn ein Feld in der Ausschlussliste enthalten ist und für das Feld der Abruftyp "EAGER" angegeben ist, wird das Feld ignoriert, da es niemals nachgeladen wird.
<property name="wsjpa.FastPath" value="false"/>
In diesem Beispiel
ist false der Standardwert. Diese Optimierung ist nicht standardmäßig aktiviert.<property name="wsjpa.FastPath" value="true"/>
Die Laufzeit
verarbeitet alle Entitäten und versucht zu ermitteln, welche Finder, Nachladeoperationen (Lazy Load)
und benannten Abfragen optimiert werden können.<property name="wsjpa.FastPath" value="true(Exclude=com.ibm.ws.jpa.entities.Customer.address,customer.findById"/>
Entspricht
Beispiel 2, außer dass das Nachladen des Felds
"Customer.address" und die benannte Abfrage
"customer.findById" aus der
FastPath-Verarbeitung ausgeschlossen sind.<property name="wsjpa.FastPath" value="true(Include=com.ibm.ws.jpa.entities.Customer, customer.findById"/>
Die einzigen Operationen, die verarbeitet werden, sind das Auffinden eines Kunden (Customer)
und die Ausführung der benannte Abfrage (NamedQuery) "customer.findById".
Alle anderen Operationen werden mit der normalen JPA-Laufzeit ausgeführt.Einschränkungen:
- Nicht kompatibel mit der Eigenschaft "openjpa.DataCache".
- Nicht kompatibel mit der Eigenschaft "openjpa.FetchPlan".
- Übergabe von LockModeType und/oder einer Map von Eigenschaften an die EntityManager-Find-Methode
- Angepasste Feldstrategien
@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- Zuordnung von XML-Spalten
- Embeddable-Objekte
- Nur die Strategie "Single Table Inheritance" (einzelne Tabelle für Vererbung) wird unterstützt
- Callback @javax.persistence.PostLoad
- Begrenzte IDs
- Ausführung eines Pfades mit folgendem Ergebnis:
- Abruf eines "ManyToMany"-Feldes
- Abruf einer "Collection", die als Map oder Array implementiert wird
- Ausführung einer SQL-Anweisung, deren Ergebnis ein Join für eine Jointabelle ist
- Ausführung einer SQL-Anweisung, deren Ergebnis ein mehrfacher Join für dieselbe Tabelle ist, d. h. eine Entität, die mehrere EAGER-OneToOne-Beziehungen (1:1-Beziehungen) zu derselben Entität hat.
- Laden mehrerer Ebenen von "eager"-Beziehungen, z. B. {A->(eager)B->(eager)C}.
- Aufruf der Methoden setFirst, setFlush, setHind, setLockMode und setMax für eine benannte Abfrage (NamedQuery).
- Nicht kompatibel mit JPA-Anwendungen, die PureQuery verwenden
- Nicht kompatibel mit JPA-Anwendungen, die die Zugriffsart (Access Intent) verwenden.
- Festlegen einer Eigenschaft zur Laufzeit, die die Art und Weise ändern, wie JPA Daten abruft