Objekt-relationales Mapping und Performance-Tuning - Thomas Krüger
←
→
Transkription von Seiteninhalten
Wenn Ihr Browser die Seite nicht korrekt rendert, bitte, lesen Sie den Inhalt der Seite unten
Agenda Wege um Daten zu lesen Wege um Daten zu modellieren Wege um Datenbanken effizient zu nutzen 2
2 Wege, Daten zu lesen Queries: OQL, SQL Navigation: 1:1 / GetObjectById(), 1:n, Hashtable 3
Queries - einfach Queries: OQL, SQL Navigation: 1:1 / GetObjectById(), 1:n, Hashtable SELECT * FROM PersonExtent AS p WHERE p.size > 180 AND p.partner.size < 160 4
Queries - einfach Queries: OQL, SQL Navigation: 1:1 / GetObjectById(), 1:n, Hashtable IObjectScope scope = …; IQueryResult result = scope.GetOqlQuery(„ OQL string“ ).Execute(); 5
Queries - schwerer Queries: OQL, SQL Navigation: 1:1 / GetObjectById(), 1:n, Hashtable SELECT p.id, p.name, p.size, p.partnerId FROM Person p JOIN Person AS b ON (p.partnerId = b.id) WHERE p.size > 180 AND b.size < 160 6
Queries - schwerer Queries: OQL, SQL Navigation: 1:1 / GetObjectById(), 1:n, Hashtable IObjectScope scope = …; IQueryResult result = scope.GetSqlQuery(„ SQL string“ , typeof(Person),null).Execute(); 7
Objektidentitäten nutzen Queries: OQL, SQL Navigation: 1:1 / GetObjectById(), 1:n, Hashtable IObjectScope scope = …; IObjectId id = scope.GetObjectId(p); IObjectScope scope2 = …; Person p2 = scope2.GetObjectById(id); 8
Speicherreferenzen Queries: OQL, SQL Navigation: 1:1 / GetObjectById(), 1:n, Hashtable Person p = scope.GetObjectById(…); if (p.size > 180 && p.partner.size < 160) { … } 9
Mengenobjekte nutzen Queries: OQL, SQL Navigation: 1:1 / GetObjectById(), 1:n, Hashtable Person p = scope.GetObjectById(…); foreach(Address a in p.addresses) { assert( a.owner == p ); } 10
Mappings nutzen Queries: OQL, SQL Navigation: 1:1 / GetObjectById(), 1:n, Hashtable String key = CultureInfo.CurrentUICulture.Name; Configuration config = user.configuration; Settings s = config.settings[key]; // Nutzer- und Kultur-abhängige persistente // Einstellungen 11
Wege um Daten zu lesen Wege um Daten zu modellieren Wege um Datenbanken effizient zu nutzen 12
OpenAccess API –Mapping Optionen Flach Vertikal Horizontal 13
OpenAccess API –Mapping Optionen Flach (Default) Vertikal Eine Tabelle mit allen Feldern Horizontal 14
OpenAccess API –Mapping Optionen Flach (Default) Separate Tabelle für die zusätzlichen Felder jeder Klasse Vertikal Horizontal 15
OpenAccess API –Mapping Optionen Flach (Default) Abstrakte Basisklasse wird in erster Ebene mitgespeichert Vertikal Horizontal 16
OpenAccess API –Mapping Optionen Embedded Typ kann in mehreren Tabellen für abhängige 1:1 Beziehungen [Persistent] struct Phone genutzt werden { string number; } [Persistent] class Person { Phone mobile; } [Persistent] class Address { Phone phone; } 17
Wege um Daten zu lesen Wege um Daten zu modellieren Wege um Datenbanken effizient zu nutzen 18
Effizienz Ziele: (A) Genau so viel Daten übertragen, wie gerade nötig, nicht mehr (B) Wenige Requests an den DB-Server. Lazy Loading Fetch Groups Reference Prefetching Prefetch + MaxResultCount Change Tracking Caching Stored Procedures 19
Lazy Loading Wenn ein Feld nicht angefordert wird von der Applikation, dann wird es auch nicht vom Server geholt. Im Extremfall werden nur identifizierende Felder vom Server geholt. Normalfall: alle Spalten einer Tabelle werden geholt. Enge Verzahnung mit Fetch Groups. 20
Fetch Groups Applikation kann benennen, welche Felder zusammen vom Server geholt werden. Jede Klasse hat eine Default Fetch Group. Normalfall: alle value types (incl. string) und references sind enthalten; collections nicht. DefaultFetchGroup kann deklarativ verändert werden Zusätzliche Fetch Groups können deklariert und genutzt werden 21
Reference Prefetching Erlaubt effizientes Laden von referenzierten Objekten Reduziert die Anzahl von C/S calls. Gut verwendbar bei abhängigen Objekten 22
Prefetch + MaxResultCount Erlaubt effizientes Lesen von größeren Ergebnismengen Default-Wert ist vom verwendeten Treiber abhängig MaxResultCount begrenzt die maximale Anzahl der Ergebnisse IQuery q = scope.GetOqlQuery(oql); q.Prefetch(20).MaxResultCount(20) 23
Change Tracking Optimierung beim Schreiben von Daten Veränderte Objekte werden protokolliert Während Commit werden nur veränderte Felder gespeichert Pendant zum Lazy Loading 24
OpenAccess Runtime API Object Layer Session Management Metadata Query Processing XML | Souce Code OQL | SQL Object Relational Layer Data Storage Management DB-Metadata FetchGroups DB-Query Backend Capabilities Logging Service Driver Layer Generic ADO 2 SQLServer (TDS) Oracle (ADO 1) SQLServer | Oracle | ... 25
Caching Caches auf mehreren Ebenen: für Objekte für Queries für States für Datenbank-Statements für Datenbank-Verbindungen 26
OpenAccess Caches API Object Layer Session Management First Level Metadata Query Processing XML | Souce Code OQL | SQL Compiled Queries Object Relational Layer Data Storage Management Second Level DB-Metadata FetchGroups DB-Query Prepared Statements Connections Backend Capabilities Logging Service Driver Layer Generic ADO 2 SQLServer (TDS) Oracle (ADO 1) SQLServer | Oracle | MySql 27
Stored Procedures Werden benutzt für Updates von Nutzertabellen für Updates von voa_keygen Tabelle für Queries Können von der Applikation benutzt werden über scope.GetSql() Methode 28
Diskussion 29
T-Shirt und Demo am Stand! Thomas Krüger tkrueger@vanatec.com
31
Vanatec OpenAccess Hervorgegangen aus bewährter JDO- Techologie (Versant OpenAccess / JDOGenie) Enge Integration in MS Visual Studio Nutzbar mit C#, Visual Basic und J# Für .Net Framework 1.1 und 2.0 Unterstützt MS-SQL, Oracle und MySQL (beta) 32
Performance : Torpedo Benchmark http://www.torpedo-group.org/torpedo-2005.jsp It is a benchmark for Java O/R Mapper Description : TORPEDO measures the number of times the database is accessed by the O-R mapping software for each application level operation. The SQL that was executed by the O-R mapping software is captured by TORPEDO and returned to the TORPEDO clients. O-R mapping software products with sophisticated caching algorithms are going to shine because TORPEDO will reveal less database access. 33
Performance : Torpedo –Results Date Product Hit Count Vendor 09/27/2004 Versant Open Access 3.2.0beta8 (openaccess-1) 16 Versant Corporation 10/01/2004 SolarMetric Kodo JDO 3.2 (kodo-5) 16 SolarMetric 11/15/2004 JCredo Enterprise Edition 1.3.7 (jcredo-1) 17 Riflexo SRL 08/15/2004 BEA WebLogic Server (CMP) 8.1 SP2 (weblogic-3) 20 BEA Systems, Inc Oracle Toplink (POJO) 10.0.3 Dev Preview (toplink- 09/07/2004 21 Oracle Corporation 3) 10/01/2004 SolarMetric Kodo JDO 3.2 (kodo-4) 21 SolarMetric 08/22/2004 Hibernate 2.1.6 (hibernate-3) 22 JBoss, Inc. Vanatec OpenAccess based on the mapping engine of Versant OpenAccess JDO 34
Sie können auch lesen