JBoss AS 7 : cache Hibernate de second niveau avec une stratégie « read-write »

Par défaut JBoss AS 7 exploite Infinispan en tant que cache Hibernate de second niveau.

Cela se traduit, dans une entité JPA, par l’utilisation d’une annotation @org.hibernate.annotations.Cache. En migrant une application utilisant un cache applicatif de second niveau de type EhCache je suis tombé sur des entités utilisant une stratégie de cache de type « read-write », via l’annotation suivante :

@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)

Au déploiement de l’application, et sans utilisation de EhCache, il y a une erreur d’Infinispan précisant qu’il n’est pas possible d’avoir un cache de type « read-write ». Via la documentation d’Hibernate il est indiqué qu’Infinispan ne gère pas le mode « read-write ». Il est donc, dans ce cas, obligatoire de s’affranchir d’Infinispan.

Pour installer EhCache 2.5.3 en tant que cache de second niveau en tant que module au sein de JBoss AS 7 / Hibernate 4.x il faut exploiter la librairie « hibernate-ehcache » qui permet de faire un lien entre Hibernate 4.x et EhCache alors que pour Hibernate 3.x le lien avec EhCache était directement inclus au sein d’EhCache via la classe net.sf.ehcache.hibernate.EhCacheRegionFactory.

Dans le dossier ${JBOSS_HOME}/modules/net/sf/ehcache/main il faut déposer le fichier ehcache-core-2.5.3.jar et créer le fichier module.xml suivant :

<?xml version="1.0" encoding="UTF-8"?>

<module xmlns="urn:jboss:module:1.1" name="net.sf.ehcache" slot="main">
    <resources>
        <resource-root path="ehcache-core-2.5.3.jar"/>
    </resources>

    <dependencies>
        <module name="org.slf4j"/>
        <module name="javax.transaction.api"/>
        <module name="javax.api" />

        <system export="false">
            <paths>
                <path name="org/xml/sax" />
                <path name="org/xml/sax/ext"/>
                <path name="org/xml/sax/helpers" />
            </paths>
        </system>
    </dependencies>
</module>

Dans le dossier ${JBOSS_HOME}/modules/org/hibernate/cache/ehcache il faut déposer le fichier hibernate-ehcache-4.0.1.Final.jar (pour Hibernate 4.0.1 packagé avec JBoss AS 7.1.1.Final) et créer le fichier module.xml suivant :

<?xml version="1.0" encoding="UTF-8"?>

<module xmlns="urn:jboss:module:1.1" name="org.hibernate.cache.ehcache">
    <resources>
        <resource-root path="hibernate-ehcache-4.0.1.Final.jar"/>
    </resources>

    <dependencies>
        <!-- ce module effectue la liaison entre ehcache et hibernate -->
        <module name="net.sf.ehcache" />
        <module name="org.hibernate" />

        <!-- dépendances d'hibernate -->
        <module name="org.jboss.logging"/>
        <module name="javax.api"/>
        <module name="javax.transaction.api"/>
    </dependencies>
</module>

Enfin au niveau du déploiement d’un ear / d’un war / etc il faut indiquer l’utilisation des modules net.sf.ehcache et org.hibernate.cache.ehcache. Par exemple avec un fichier jboss-deployment-structure.xml d’un ear :

<?xml version="1.0" encoding="UTF-8"?>

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.1">
    <ear-subdeployments-isolated>false</ear-subdeployments-isolated>

    <deployment>
        <dependencies>
            <module name="net.sf.ehcache" />
            <module name="org.hibernate.cache.ehcache" />
        </dependencies>
    </deployment>
</jboss-deployment-structure>
Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s