Info
Datum: 23. 02. 2026 um 21:08:56
Schlagworte: Java Morphium Programmieren MongoDB open_source
Kategorie: morphium
erstellt von Stephan Bösebeck
logged in
ADMIN
Morphium v6.0.1 bis v6.1.8 - Was hat sich getan?
Seit dem Release von Morphium v6.0.0 ist einiges passiert. In mittlerweile 13 Releases haben wir die Java-MongoDB-Bibliothek in vielen Bereichen verbessert - von grundlegenden Architekturänderungen über Performance-Optimierungen bis hin zu einem deutlich stabileren Connection-Pool. Hier ein Überblick über die wichtigsten Neuerungen.
Null-Handling komplett überarbeitet (v6.0.1)
Das Null-Handling in Morphium war historisch gewachsen und nicht besonders intuitiv. Mit v6.0.1 haben wir das grundlegend geändert:
- Neues Standardverhalten: Null-Werte werden jetzt als explizite
null-Werte in der Datenbank gespeichert - so wie man es von Hibernate und JPA kennt. - Neue
@IgnoreNullFromDB-Annotation: Wer das alte Verhalten braucht, kann Felder gezielt vor Null-Kontamination schützen. @UseIfNulldeprecated: Die alte Annotation mit ihrer verwirrenden invertierten Logik ist deprecated, funktioniert aber weiterhin.
Das ist ein Breaking Change, aber einer, der das API deutlich konsistenter macht.
MorphiumServer: Vom Testhelfer zum Mini-MongoDB (v6.1.0)
Der MorphiumServer hat den größten Sprung gemacht. Was als einfacher InMemory-Ersatz für Tests begann, ist jetzt eine echte Alternative für Entwicklungs- und Testumgebungen:
Replica-Set-Support
- Automatische Primary-Election: Ein Raft-inspiriertes Election-Protokoll wählt den Primary basierend auf konfigurierbaren Prioritäten.
- Automatisches Failover: Fällt der Primary aus, wird automatisch ein neuer gewählt.
- Datenreplikation: Änderungen werden über Change Streams an Secondaries repliziert - inklusive
drop,replaceundrename.
SSL/TLS
MorphiumServer akzeptiert jetzt verschlüsselte Verbindungen: server.setSslEnabled(true); server.setSslContext(sslContext);
Persistenz
Daten können jetzt auf Disk geschrieben und beim Start wiederhergestellt werden: java -jar morphium-server-cli.jar --dump-dir /data --dump-interval 60
Weitere Server-Verbesserungen
- Standalone CLI-JAR (
morphium-server-cli.jar) - Netty-basierter Wire-Protocol-Handler für bessere Performance
listDatabases-Support, korrektekillCursors-Behandlung- Write-Concern-Handling mit partiellen Replica Sets
InMemoryDriver: Schneller und feature-reicher
Performance-Optimierungen
Die Performance des InMemoryDrivers wurde deutlich verbessert:
- Parallelität: Globale Synchronisierung auf
sendCommand()entfernt - Operationen auf verschiedenen Collections laufen jetzt parallel. - Smarte Deep-Copies: Dokumente werden erst nach erfolgreichem Query-Match kopiert, Projektionen berücksichtigt.
- $in-Operator: Von O(n*m) auf O(n+m) durch HashSet-Lookups.
- TTL-Handling: Collections ohne TTL-Index haben jetzt Zero Overhead.
- Index-Lookups: Einfache Equality-Queries nutzen
Objects.equals()statt vollständigemmatchesQuery().
Neue Features
- Tailable Cursors: InMemoryDriver unterstützt jetzt Tailable Queries.
- Shared Databases: Mehrere Morphium-Instanzen können sich eine InMemory-Datenbank teilen.
$text-Queries: MongoDB-kompatible Volltextsuche mit Phrase-Search und Negation.
Connection-Pool: Endlich stabil (v6.1.4 - v6.1.8)
Der Connection-Pool war über mehrere Releases hinweg das Sorgenkind. Ab v6.1.4 haben wir systematisch alle bekannten Probleme behoben:
Counter-Drift behoben
Das Hauptproblem: Der borrowedConnections-Counter driftete, sodass der Pool irgendwann "voll" erschien, obwohl alle Connections zurückgegeben waren. Ursachen:
- Hostname-Case-Mismatch: MongoDB meldet Hostnames anders als im Seed konfiguriert (
SERV-MSG1vsserv-msg1). DiereleaseConnection()fand die Connection nicht wieder. Fix: Alle Hostname-Operationen normalisieren auf Lowercase. - Topology-Changes: Wenn ein Host aus dem Replica Set verschwand, wurden geliehene Connections nicht decrementiert. Fix:
borrowedFromHost-Tracking für korrekte Zuordnung. - Double-Decrement-Race: Unter Concurrency konnte derselbe Counter doppelt decrementiert werden. Fix: Guard gegen Double-Decrement.
Connection-Leaks geschlossen
- Heartbeat-Connections wurden bei Exceptions nicht zurückgegeben.
- ChangeStreamMonitor gab Connections nicht frei, wenn die Watch kein Connection-Objekt hatte.
- Zombie-Connections bei Socket-Close vor Cleanup.
Concurrency-Verbesserungen
synchronized+waitdurchReentrantLock+Conditionersetzt.add()durchoffer(timeout)auf Connection-Queues ersetzt - keine Deadlocks mehr.- Parallele Connection-Erstellung (bis zu 10 Virtual Threads) für Burst-Szenarien.
ChangeStreamMonitor: Selbstheilend (v6.1.4+)
- Retry statt Crash: Bei "connection closed" wird die Verbindung neu aufgebaut statt den Monitor zu stoppen.
- Resume Tokens: Der Monitor merkt sich den letzten Token und setzt nach Reconnect dort fort - keine doppelten oder verlorenen Events mehr.
- ChangeStreamHistoryLost: Veraltete Resume Tokens werden verworfen, der Stream startet frisch.
- Lock-TTL-Bug: Messages ohne Timeout hatten TTL=0, Locks wurden sofort gelöscht. Fix: 7 Tage Fallback-TTL.
Messaging-Stabilität
- Nachrichten an sich selbst funktionieren jetzt korrekt.
- MultiCollectionMessaging respektiert
setUseChangeStream(false)auch für Direct Messages. - Sequence Generator behandelt Stale Locks besser.
- Diverse Deadlocks in Messaging und Server behoben.
Jackson entfernt (Post v6.1.8)
Jackson wurde als Dependency entfernt, um Dependency-Konflikte zu vermeiden. Die JSON-Serialisierung läuft jetzt komplett über Morphiums eigenen ObjectMapper. Ein Nachfolge-Fix stellt sicher, dass List-Properties (wie hostSeed) beim Roundtrip korrekt serialisiert werden.
Test-Infrastruktur komplett modernisiert
- Multi-Driver-Tests: 72 Testklassen auf
MultiDriverTestBasemigriert, 356+ Tests als@ParameterizedTest. - Backend-Auswahl:
runtests.shunterstützt--driver inmem|pooled|allund--morphium-server. - Bessere Isolation: Jeder Test räumt nur seine eigene Datenbank auf.
- Skip/Limit-Alignment: Einheitliches Verhalten über alle Driver hinweg.
Fazit
Von v6.0.0 bis v6.1.8 hat sich Morphium in praktisch jedem Bereich verbessert. Der MorphiumServer ist vom simplen Test-Mock zu einer echten leichtgewichtigen Alternative gewachsen, der Connection-Pool ist endlich zuverlässig, und die Performance des InMemoryDrivers macht Unit-Tests deutlich schneller.
Das nächste Ziel: Noch weniger externe Dependencies und weiter Richtung Production-Readiness für den MorphiumServer.