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:
- Die Infinispan CacheManager-Instanz wird im JNDI-Context gebunden
Dazu wird eineJndiInfinispanRegionFactory
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>
- 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.
- 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.
- 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>
- 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>
- Applikation läuft innerhalb eines Applikation Servers
- 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>
The post Infinispan als JPA / Hibernate Second Level Cache appeared first on techscouting through the java news.