Custom Caching in Morphium

veröffentlicht am : So, 20. 05. 2018 geändert am: So, 20. 05. 2018

Schlagworte: java mongodb morphium cache


Seit eine der ersten Versionen hat Morphium einen Cache eingebaut, der durch Annotations (Cache) konfiguriert wird.

Dieser Cache wurde in vielen Projekten genutzt und hat gezeigt, dass er gut funktioniert, auch das Synchronisieren des Caches über das Morphium Messaging System funktioniert tadellos.

Jedoch gibt es einige Implementierungen da draußen, die viele neue Features bieten. Und es macht wirklich nur bedingt Sinn, den alle diese Features auch in Morphium einzubauen. Stattdessen haben wir uns entschlossen, mit der aktuellen Betaversion den JCache-Standard (JSR107) zu unterstützen.

Dazu mussten einige Dinge angepasst werden, insbesondere das MorphiumCache-Interface.

Morphium selbst besitzt ja schon immer die möglichkeit, eine eigene Custom-Cache Implementierung zu nutzen. Jedoch ist so was natürlich nicht wirklich einfach machbar. Jedoch nutzen wir diesen Umstand um jetzt beide Cache Implementierungen integrieren zu können:

  1. Die Default Cache implementierung, die sich seit Jahren bewährt hat
  2. Eine JCache-Implementierung, welche auf eine beliebige JCache-Library (z.B. ehcache) zugreifen kann

Damit Morphium, wie immer schon, out of the Box lauffähig ist, haben wir auch noch eine JCache-Implementierung des bewährten Caches gebaut.

How to use

Mit der neuen V3.2.2BETA (via maven central oder auf github )wird Morphium per default die JCache-IMplementierung verwenden. Möchte man stattdessen lieber die neue Jcache-IMplementierung nutzen, muss man dies in der Configuration nur eintragen:

    MorphiumConfig cfg=new MorphiumConfig();
    cfg.setCache(new MorphiumCacheImpl());

für die json oder property file Konfiguration, muss nur die klasse gesetzt werden:

  cacheClassName=de.caluga.morphium.cache.MorphiumCacheImpl

JCache Unterstützung

Wenn man alles auf Default lässt,wird die JCache API genutzt. Standardmäßig wird zunächst die Default-Cache implementierung via Caching.getCachingProvider().getCacheManager() genutzt.

Möchte man lieber seine eigenen Caches eintragen, so ist dies problemlos möglich. Dei Morphium JCache-Implementierung benötigt "nur" einen CacheManager. Die Caches selbst werden von Morphium angelegt und verwaltet.

  CachingProvider provider = Caching.getCachingProvider();
   morphium.getCache.setCacheManager(provider.getCacheManager());

natürlich kann man via code hier noch eigene Einstellungen vornehmen.

BTW: möchte man die Morphium eigene JCache-IMplementierung auch anderswo nutzen, so kann man dies tun, indem man die JCache Implementierung über -Djavax.cache.spi.CachingProvider=de.caluga.morphium.cache.jcache.CachingProviderImpl setzen.

Hinweis:

Alle JCache-Implementierungen unterstützen ein automatisches löschen von älteren / nicht genutzten Einträgen. Leider lässt sich die Morphium Policy nicht so ohne weiteres auf die Caches abbilden, weshalb Morphium ein eigenes Housekeeping implementiert, welches alte Elemente aus dem Cache entfernt.

  • Zusatzinfo*

die Cache Synchronisierung funktioniert auch mit der JCache kompatiblen Version. Und da dieser Cache auch außerhalb von Morphium genutzt werden kann, würden dann eben auch diese Caches synchronisiert werden.

Maven settings

    <groupId>de.caluga</groupId>
    <artifactId>morphium</artifactId>
    <version>3.2.2BETA1</version>

known bugs

Es gibt ein paar kleinere Bugs mit der aktuellen Beta:

  • die CacheListener Callbacks funktionieren wohl nicht mehr zu 100% mit JCache. Zumindest im Zusammenspiel mit EHCache scheint es da Probleme zu geben. Mit der Morphium eigenen JCache Implementierung funktioniert es
  • Es gibt einen Bug mit den Globalen Cache Einstellungen, welche nicht immer sauber an die Caches weiter gegeben werden.
  • Das Messaging Subsystem scheint auch betroffen zu sein.

erstellt Stephan Bösebeck (stephan)