2011-03-11 31 views
9

Estoy trabajando con un proyecto de primavera que usa hibernate y busco implementar caché de segundo nivel usando ehcache. Veo una serie de enfoques para esto:Spring: hibernate + ehcache

  1. spring-modules-cache que introduce el @Cacheable anotación

  2. ehcache-spring-annotations un conjunto de herramientas que pretende ser el sucesor de spring-modules-cache.

  3. Hibernate cache está muy bien integrado en la hibernación para realizar el almacenamiento en caché utilizando, por ejemplo, la anotación @Cache.

  4. Programmatic cache utilizando proxies. config basada en anotaciones rápidamente se convierte en limitada o compleja (por ejemplo, varios niveles de anidamiento de anotación)

Personalmente no creo spring-modules-cache es lo suficientemente completa, por lo tanto, que probablemente preferiría tener en cuenta la forma más activa desarrollado ehcache-spring-annotations. Hibernate cache aunque parece ser la implementación más completa (por ejemplo, caché de lectura y escritura, etc.).

¿Qué motivaría qué conjunto de herramientas usar? Por favor comparta su experiencia de almacenamiento en caché ...

Respuesta

9

Nuestro proyecto utiliza la opción 3. Aplicamos anotación org.hibernate.annotations.Cache a las entidades que nos caché en un Ehcache, configurar Ehcache usando ehcache.xml, y activar y configurar el Hibernate second-level cache en hibernate.cfg.xml:

<!-- Enable the second-level cache --> 
    <property name="hibernate.cache.provider_class"> 
     net.sf.ehcache.hibernate.EhCacheProvider 
    </property> 
    <property name="hibernate.cache.region.factory_class"> 
     net.sf.ehcache.hibernate.EhCacheRegionFactory 
    </property> 
    <property name="hibernate.cache.use_query_cache">true</property> 
    <property name="hibernate.cache.use_second_level_cache">true</property> 
    <property name="hibernate.cache.use_structured_entries">true</property>  
    <property name="hibernate.cache.generate_statistics">true</property> 

Para la mayoría de las entidades, se utiliza estrategia de concurrencia caché CacheConcurrencyStrategy.TRANSACTIONAL:

@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL) 

proyecto Nuestra Maven utiliza Hibernate 3.3.2GA y Ehcache 2.2.0:

<dependency> 
     <groupId>net.sf.ehcache</groupId> 
     <artifactId>ehcache-core</artifactId> 
     <version>2.2.0</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>3.3.2.GA</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-commons-annotations</artifactId> 
     <version>3.3.0.ga</version> 
     <exclusions> 
      <exclusion> 
       <groupId>net.sf.ehcache</groupId> 
       <artifactId>ehcache</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-annotations</artifactId> 
     <version>3.2.1.ga</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>ejb3-persistence</artifactId> 
     <version>3.3.2.Beta1</version> 
    </dependency> 
+1

Genial, ¿cómo te está resultando eso, satisfactorio? Después de probar las opciones 1 y 2, siento que todavía son bastante limitadas y no tan concisas como me gustaría. –

+0

Nuestra experiencia en la configuración de Hibernate y Ehcache fue relativamente sencilla hasta que habilitamos la replicación de memoria caché RMI sincrónica en nuestro clúster. Cuando está habilitado, Hibernate comenzó a lanzar excepciones raras. Para resolver estas excepciones, habilitamos 'hibernate.cache.use_structured_entries'. Las versiones posteriores de Hibernate pueden no tener este problema, pero cuando estábamos tratando de resolver este problema, nuestro entorno no era compatible con Hibernate 3.5.6. –

+1

documenté esta experiencia en http://stackoverflow.com/questions/3631349/how-do-i-cure-the-cause-of-hibernate-exception-illegalargumentexception-occurred. –

3

Spring 3.1 tiene una nueva abstracción de caché incorporada. Read here.

Cuestiones relacionadas