Infinispan als JPA / Hibernate Second Level Cache

Infinispan lässt sich mit einigen wenigen Konfigurationen als Hibernate-JPA Second Level Cache Provider nutzen. Hier wird nicht erläutert, wie Entitäten, Collections, Queries etc. konfiguriert werden müssen um gecached zu sein, sondern es folgt ein kurzer Überblick der notwendigen Provider-Konfigurationen.

Second Level Cache einschalten

Mit folgendem Eintrag in der persistence.xml wird der Second Level Cache in JPA eingeschaltet.

<property name="hibernate.cache.use_second_level_cache" value="true" />

Das Pendant mit plain Hibernate sieht wie folgt aus.

<property name="hibernate.cache.use_second_level_cache">true</property>

Um die Query-Ergebnisse cachen zu können, muss zusätzlich zu obigen Einstellungen das Caching der Abfrageergebnissen in einer JPA-Umgebung wie folgt konfiguriert werden.

<property name="hibernate.cache.use_query_cache" value="true" />

Und in einer reinen Hibernate-Umgebung sieht die gleiche Konfiguration wie folgt aus.

<property name="hibernate.cache.use_query_cache">true</property>

Infinispan Cache Region Factory konfigurieren

Als nächster Schritt ist die “Infinispan Cache Region Factory” zu konfigurieren. Für diese Konfiguration existieren zwei Varianten:

  1. Die Infinispan CacheManager-Instanz wird im JNDI-Context gebunden
    Dazu wird eine JndiInfinispanRegionFactory als “cacheregion factory” konfiguriert. Als CacheManager-Instanz wird der CacheManager-JNDI-Name parametrisiert.
    In einer JPA-Umgebung sieht die Konfiguration folgendermaßen aus:

    <property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.infinispan.JndiInfinispanRegionFactory" />
    <property name="hibernate.cache.infinispan.cachemanager" value="java:CacheManager" />
    

    In einer Hibernate-Umgebung sieht die Konfiguration wie folgt aus:

    <property name="hibernate.cache.region.factory_class">org.hibernate.cache.infinispan.JndiInfinispanRegionFactory</property>
    <property name="hibernate.cache.infinispan.cachemanager">java:CacheManager/entity</property>
    
  2. JPA/Hibernate und Infinispan werden in einer standalone Umgebung oder in einem Third Party Application Server benutzt
    In diesem Fall wird die “Infinispan Region Factory” in einer JPA-Umgebung wie folgt konfiguriert:

    <property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.infinispan.InfinispanRegionFactory"/>
    

    und in einer Hibernate-Umgebung wie folgt konfiguriert:

    <property name="hibernate.cache.region.factory_class">org.hibernate.cache.infinispan.InfinispanRegionFactory</property>
    

JTA Transaction

Hibernate soll bzw. muss mit JTA Transaktionen konfiguriert sein, sodass Hibernate und Infinispan innerhalb der gleichen Transaktion kooperieren.
Probleme könnten auftreten, wenn z.B. Hibernate nur mit JDBC Transaktionen konfiguriert ist. In diesem Fall würde Hibernate eine Transaktion über java.sql.Connection erzeugen und Infinispan würde über den TransactionManager, der von hibernate.transaction.manager_lookup_class zurückgegeben wird, eine andere Transaktion nutzen.

Folgende Konfigurationsschritte müssen vorgenommen werden.

  1. Die richtige “Hibernate Transaction Factory” muss konfiguriert werden, falls mit Hibernate gearbeitet wird. JPA erwartet nicht, dass eine Transaction Factory konfiguriert wird, da der Entity Manager sie bereits zur Verfügung stellt.
    1. Applikation läuft innerhalb eines Applikation Servers
      Wenn JPA benutzt wird, sieht die Konfiguration wie folgt aus:

      <property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.CMTTransactionFactory"/>
      

      Mit plain Hibernate wäre die entsprechende Konfiguration wie folgt.

      <property name="hibernate.transaction.factory_class">org.hibernate.transaction.CMTTransactionFactory</property>
      
    2. Applikation in einer standalone Umgebung mit einer JTA Transaction Factory
      <property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.JTATransactionFactory"/>
      
      <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property>
      
  2. Den richtigen Hibernate Transaction Manager Lookup auswählen
    Wenn die Applikation innerhalb eines Applikation Servers läuft, dann bitte hier die richtige Klasse auswählen.

    <property name="hibernate.transaction.manager_lookup_class"
       value="org.hibernate.transaction.JBossTransactionManagerLookup"/>
    
    <property name="hibernate.transaction.manager_lookup_class">
       org.hibernate.transaction.JBossTransactionManagerLookup
    </property>
    
Short URL for this post: https://wp.me/p4nxik-25m
This entry was posted in Java EE, Java Persistence, Java Runtimes - VM, Appserver & Cloud and tagged , , , , , . Bookmark the permalink.

Leave a Reply