Objekt-relationales Mapping und Performance-Tuning - Thomas Krüger

Die Seite wird erstellt Armin Bergmann
 
WEITER LESEN
Objekt-relationales Mapping und Performance-Tuning - Thomas Krüger
Objekt-relationales Mapping und
Performance-Tuning

Thomas Krüger

tkrueger@vanatec.com
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