Morphium v6.x Update: 13 Releases im Überblick

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.x Update: 13 Releases im Überblick

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.
  • @UseIfNull deprecated: 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, replace und rename.

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, korrekte killCursors-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ändigem matchesQuery().

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-MSG1 vs serv-msg1). Die releaseConnection() 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 + wait durch ReentrantLock + Condition ersetzt.
  • add() durch offer(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 MultiDriverTestBase migriert, 356+ Tests als @ParameterizedTest.
  • Backend-Auswahl: runtests.sh unterstützt --driver inmem|pooled|all und --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.