Database & Persistence Workbench
SQL, JPA, JDBC, jOOQ, Transaktionen, Locking, Migrationen und Performance. Nutze die Seite bei Änderungen an Daten oder Schema: Plane Kompatibilität, Migration, Konsistenz, Rückweg und eine messbare Kontrolle nach dem Rollout.
Arbeitsauftrag
Wann verwenden?
Bei Schemaänderungen, Transaktionsproblemen, Sperren oder auffälligen Datenbankzugriffen.
Nicht dafür verwenden
Nicht um fachliche Konsistenz ausschließlich an technische Constraints zu delegieren.
Definition of Done
Migration ist vorwärts- und rückwärtsverträglich; Transaktionen, Indizes, Locks, Datenqualität und Rollback sind geprüft.
Datenzugriff auswählen
| Ansatz | Stärke | Risiko | Prüfung |
|---|---|---|---|
| JPA | Aggregate und Standardzugriffe | versteckte Queries und N+1 | SQL- und Transaktionstest |
| JDBC/jOOQ | explizite SQL-Kontrolle und Reporting | mehr Mappingcode | Queryplan und Integrationstest |
| Append-only Ledger | Audit und Gegenbuchung | komplexere Projektionen | Invarianten- und Reconciliation-Test |
Zugriffstechnologie wählen
JPA ist stark für Aggregate mit klarer Lebensdauer. JDBC oder jOOQ geben bei komplexen SQL-Abfragen und Reporting häufig mehr Kontrolle.
Eine Anwendung darf mehrere Techniken verwenden, wenn die Grenzen klar und der Betriebsaufwand vertretbar sind.
SELECT o.id, o.status, SUM(l.quantity * l.unit_price) AS total
FROM orders o
JOIN order_lines l ON l.order_id = o.id
WHERE o.created_at >= :from
GROUP BY o.id, o.status
ORDER BY total DESC;
Locking und Konkurrenz
Optimistisches Locking erkennt konkurrierende Änderungen. Pessimistisches Locking verhindert sie durch Sperren, kann aber Durchsatz und Deadlock-Risiko verschlechtern.
Die Entscheidung richtet sich nach Konfliktwahrscheinlichkeit, Kosten eines Retries und Länge der Transaktion.
UPDATE inventory
SET available = available - :quantity,
version = version + 1
WHERE product_id = :productId
AND available >= :quantity
AND version = :expectedVersion;
Expand and Contract
Kompatible Datenbankänderungen werden in mehreren Deployments umgesetzt: neue Struktur ergänzen, parallel schreiben oder migrieren, Leser umstellen und alte Struktur erst später entfernen.
Praxisartefakt · Schemaänderung
- Expand
-
Nullable-Spalte
delivery_windowhinzufügen und alten Code weiter betreiben. - Backfill
- In begrenzten Batches mit Fortschritts- und Fehlerzählung.
- Switch
- Neue Version schreibt beide Lesepfade kompatibel.
- Contract
- Nach vollständiger Nutzung Constraint setzen und alten Pfad entfernen.
- Rollback
- Alte Anwendung ignoriert die neue Spalte; keine destruktive Migration im selben Release.