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

Anmerkung: FastPath wird nur vom WSJPA-Persistenzprovider unterstützt.

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.

Sehen Sie sich z. B. den folgenden Code an:
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.

Wenn das FastPath-Feature aktiviert ist, wird beim ersten Aufruf von "em.find (Customer.class, id)" stark optimierter Code erzeugt, der alle nachfolgenden Aufrufe von "em.find (Customer, id)" ersetzt. Dieser generierte Code geht davon aus, dass sich jedes Mal, wenn ein Kunde (Customer) gefunden wird, lediglich die ID ändert. Als Ergebnis wird ein Code generiert, der beinahe entscheidungsfrei ist. Wenn die FastPath-Generierung erfolgreich ist, wird beim ersten Methodenaufruf, eine Nachricht ähnlich der folgenden protokolliert:
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.

Wenn "wsjpa.FastPath" konfiguriert ist, muss openjpa.MetaDataRepository=Preload=true ebenfalls konfiguriert sein. Beispiele:
<property name=”openjpa.MetaDataRepository” value=”Preload=true”/>
Anmerkung: Für den Fall, dass ein angegebener Pfad von der FastPath-Laufzeit nicht optimiert werden kann oder in der Eigenschaft "Exclude" konfiguriert ist, wird er vom normalen JPA-Laufzeitcode ausgeführt. Dies ist ein wesentliches Merkmal, das es erlaubt, mit der FastPath-Optimierung zu experimentieren. Alle nicht-optimierten Codepfade verwenden automatisch und ohne Funktionsverlust den ursprünglichen JPA-Codepfad.
Konfigurationssyntax :
<property name=”wsjpa.FastPath”
                              value=”true(Include=’<path>;,<path>;...’;Exclude=’<Pfad>,<Pfad>...’)”>
Pfadsyntax :
  • 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)
Regeln:
  • 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.
Beispiel 1:
<property name="wsjpa.FastPath" value="false"/>
In diesem Beispiel ist false der Standardwert. Diese Optimierung ist nicht standardmäßig aktiviert.
Beispiel 2:
<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.
Beispiel 3:
<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.
Beispiel 4:
<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:

Wie bereits erwähnt, müssen Kompromisse eingegangen werden, um die volle Leistungssteigerung durch die Verwendung der FastPath-Optimierungen zu realisieren. Während diese Funktion versucht, eine Vielzahl von Entitätsmodellen und JPA-Funktionen zu unterstützen, gibt es eine Reihe von bekannten Fällen, die nicht durch die FastPath-Optimierung unterstützt werden. Nachfolgend ist eine Liste der derzeit bekannten 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

Symbol, das den Typ des Artikels anzeigt. Taskartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tejb_jpafastpath
Dateiname:tejb_jpafastpath.html