Skip to the content
Documentation
Help Start
Reading in:
  • German: 9,059 of 9,059 pages
About the help in other languages
All help pages

Persistenz und die Datenbankschicht

Wie Exponential mit seiner Datenbank spricht - die Fabrik eZDB und die Treiber, eZPersistentObject als Tabellen-Mapper, Transaktionen, die durch Zählen verschachtelt werden, der SQL-Abfrage-Cache, Isolationsstufen und…

Download as PDF

Address: https://doc.exponential.earth/exphelp/viewer/help/software-engineers/persistence-and-the-database-layer.md

On this page

This page is a translation. Read the English original

Persistenz und die Datenbankschicht

Diese Seite richtet sich an Ingenieure, die Code schreiben oder prüfen, der die Datenbank liest und schreibt. Exponential hat kein ORM im Sinne von Doctrine oder Hibernate: Es hat eine Datenbankfabrik mit einem Treiber je Engine und einen Mapper im Stil von Active Record, eZPersistentObject, mit einer PHP-Klasse je Tabelle. Die maßgeblichen Regeln stehen in Standards für Datenbanken und SQL.

Inhalt

  1. Die Teile
  2. eZPersistentObject
  3. Rohe Abfragen
  4. Transaktionen
  5. Der SQL-Abfrage-Cache
  6. Wenn Sie von einem ORM kommen

Die Teile

TeilWoRolle
eZDBlib/ezdb/classes/Fabrik: eZDB::instance() gibt die Verbindung des aktuellen Siteaccess zurück
eZDBInterfacelib/ezdb/classes/die gemeinsame Schnittstelle jedes Treibers
TreibereZSQLite3DB, eZPostgreSQLDB, eZMySQLiDB, expMongoDB, eZNullDB; eZOracleDB aus ezoracleeiner je Engine (Datenbanken: eine wählen und betreiben)
eZPersistentObjectkernel/classes/ezpersistentobject.phpbildet eine Klasse auf eine Tabelle ab
eZDBQueryCachelib/ezdb/classes/ezdbquerycache.phpoptionaler Cache für SELECT-Ergebnisse
Schema-Handlerlib/ezdbschema/classes/lesen und schreiben .dba-Schemadateien je Engine

Der Treiber wird durch site.ini [DatabaseSettings] DatabaseImplementation gewählt, aufgelöst über ImplementationAlias[].

eZPersistentObject

Eine Unterklasse gibt ihre Tabellenbeschreibung aus static function definition() zurück: fields, keys, increment_key, class_name, name (die Tabelle) und function_attributes. Lesen erfolgt über eZPersistentObject::fetchObject() und fetchObjectList(); Schreiben über store() und remove(). Diese Methoden maskieren Werte für Sie.

Neue Tabellen sollten eine Persistenzklasse erhalten statt handgeschriebenem SQL, und ihr Schema muss share/db_schema.dba, die Update-Dateien jedes Treibers und jeden unterstützten Treiber erreichen (Schemaänderungen und Migrationen). Durchgerechnete Beispiele: Persistente Objekte und eigene Tabellen und die Referenz zu eZPersistentObject. Das Muster ist im Katalog als Active Record beschrieben.

Rohe Abfragen

Anweisungen werden als Zeichenketten gebaut; für jeden Wert aus einer Anfrage, einer Einstellung oder der Datenbank sind daher zwei Regeln verpflichtend:

  1. Maskieren Sie jede Zeichenkette mit $db->escapeString( $value ), innerhalb einfacher Anführungszeichen.
  2. Casten Sie jede Zahl mit (int), bevor sie ins SQL geht.
$db = eZDB::instance();
$rows = $db->arrayQuery(
    "SELECT id, name FROM ezsection WHERE identifier = '" . $db->escapeString( $identifier ) . "'"
    . " AND id <> " . (int)$excludeId,
    array( 'offset' => 0, 'limit' => 10 )
);

Übergeben Sie Offset und Limit wie oben als Parameter, damit jeder Treiber seine eigene LIMIT-Syntax schreibt. Die Unterschiede der Dialekte stehen unter Portables SQL schreiben.

Transaktionen

  • $db->begin() und $db->commit() werden durch Zählen verschachtelt: Nur das äußerste Paar sendet BEGIN und COMMIT. $db->rollback() rollt die ganze Transaktion zurück.
  • Schreibvorgänge aus mehreren Anweisungen im Kernel-Code müssen in begin() und commit() eingeschlossen sein.
  • Kein Treiber setzt eine Isolationsstufe; jede Engine läuft mit ihrem eigenen Standard. Code, der von einer abhängt, ist engine-abhängig.
  • SQLite serialisiert Schreibende: Der Treiber nimmt eine Sperrdatei und führt BEGIN IMMEDIATE aus und wartet bis zu [DatabaseSettings] SQLiteTransactionWait Sekunden (SQLite-Transaktionen).
  • Schreibvorgänge in MongoDB sind nicht transaktional: Jede Operation wird für sich festgeschrieben.

Der SQL-Abfrage-Cache

querycache.ini kann SELECT-Ergebnisse im Speicher halten, bis ein Schreibvorgang in eine der gelesenen Tabellen sie veralten lässt. Er ist standardmäßig aus (Mode=off), und der MongoDB-Treiber verwendet ihn nicht. Ist er an, muss alles, was von außerhalb von Exponential in die Datenbank schreibt (ein SQL-Client, eine Wiederherstellung, ein anderes Programm), ihn danach leeren:

php bin/php/ezcache.php --clear-id=querycache --allow-root-user

Siehe Der SQL-Abfrage-Cache.

Wenn Sie von einem ORM kommen

Sie erwarten vielleichtIn Exponential
Entities mit Relationen und Lazy Loadingein Definitions-Array je Tabelle; verwandte Objekte werden über ausdrückliche Aufrufe oder function_attributes geladen
Eine Unit of Work, die Änderungen schreibtstore() schreibt sofort
Prepared Statements mit gebundenen ParameternZeichenketten bauen mit escapeString() und Casts
Erzeugte Migrationen.dba-Schemadateien und SQL-Update-Dateien je Treiber, von Hand geschrieben und angewendet
Ein Repository je Aggregatstatische Fetch-Methoden an der Persistenzklasse und Fetch-Funktionen für Templates

Verwandte Seiten

Werden Sie Exponential-Partner

Partner teilen ihre Informationen, stellen Mittel bereit, geben Beiträge zurück und entwickeln die Produkte mit uns, und so wächst Exponential. Eine Partner-Website und ein Dashboard sind für Mitte 2027 geplant: Werden Sie noch heute Partner, damit wir schneller wachsen und neue Funktionen früher liefern.

Something wrong on this page? Report an error

Documentation license

This documentation is free documentation, licensed under the GNU Free Documentation License 1.3 or later.

Exponential Copyright © 1998-2026 Exponential Foundation and 7x