2016-03-30 1 views
1

Je suis nouveau au printemps, hiberner, c3p0 & ehcache. Je développe une application complètement en utilisant Java Configuration sauf web.xml. Je dois utiliser le cache de second niveau dans mon application. Donc, j'ai ajouté le code suivantprintemps + hibernate + c3p0 + configuration ehcache java

import net.sf.ehcache.config.CacheConfiguration; 

import org.springframework.cache.CacheManager; 
import org.springframework.cache.annotation.CachingConfigurer; 
import org.springframework.cache.annotation.EnableCaching; 
import org.springframework.cache.ehcache.EhCacheCacheManager; 
import org.springframework.cache.interceptor.CacheErrorHandler; 
import org.springframework.cache.interceptor.CacheResolver; 
import org.springframework.cache.interceptor.KeyGenerator; 
import org.springframework.cache.interceptor.SimpleKeyGenerator; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 

@Configuration 
@EnableCaching 
public class CachingConfig implements CachingConfigurer{ 

    @Bean(destroyMethod="shutdown") 
    public net.sf.ehcache.CacheManager ehCacheManager() { 
     CacheConfiguration cacheConfiguration = new CacheConfiguration(); 
     cacheConfiguration.setName("myCacheName"); 
     cacheConfiguration.setMemoryStoreEvictionPolicy("LRU"); 
     cacheConfiguration.setMaxEntriesLocalHeap(1000); 

     net.sf.ehcache.config.Configuration config = new net.sf.ehcache.config.Configuration(); 
     config.addCache(cacheConfiguration); 

     return net.sf.ehcache.CacheManager.newInstance(config); 
    } 

    @Bean 
    @Override 
    public CacheManager cacheManager() { 
     return new EhCacheCacheManager(ehCacheManager()); 
    } 

    @Override 
    public CacheResolver cacheResolver() { 
     return null; 
    } 

    @Override 
    public CacheErrorHandler errorHandler() { 
     return null; 
    } 

    @Override 
    public KeyGenerator keyGenerator() { 
     return new SimpleKeyGenerator(); 
    } 

} 

Dans web.xml je l'ai ajouté comme

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value> 
     ApplicationContextConfiguration 
     CachingConfig 
    </param-value> 
    </context-param> 

Mon ApplicationContextConfiguration est

import java.beans.PropertyVetoException; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.Properties; 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor; 
import org.springframework.orm.jpa.JpaVendorAdapter; 
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; 
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; 
import org.springframework.transaction.annotation.EnableTransactionManagement; 

import com.mchange.v2.c3p0.ComboPooledDataSource; 


@Configuration 
@EnableTransactionManagement 
public class ApplicationContextConfiguration 
{ 
     @Bean 
     public LocalContainerEntityManagerFactoryBean entityManagerFactory() throws IOException { 
      LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean(); 
      entityManagerFactory.setDataSource(pooledDataSource()); 
      entityManagerFactory.setPackagesToScan(new String[] { "*" });  
      JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 
      entityManagerFactory.setJpaVendorAdapter(vendorAdapter); 
      entityManagerFactory.setJpaProperties(additionalProperties());  
      return entityManagerFactory; 
     } 

     @Bean 
     public ComboPooledDataSource pooledDataSource() throws IOException{ 
      ComboPooledDataSource dataSource = new ComboPooledDataSource(); 
      Properties properties = new Properties(); 

      BufferedReader input = new BufferedReader (new InputStreamReader (getClass().getResourceAsStream("/config/hibernate.properties"))); 
      properties.load(input); 
      try { 
       dataSource.setDriverClass(properties.getProperty("hibernate.connection.driver_class")); 
      } catch (PropertyVetoException e) { 
       e.printStackTrace(); 
      } 
      dataSource.setJdbcUrl(properties.getProperty("hibernate.connection.url")); 
      dataSource.setUser(properties.getProperty("hibernate.connection.username")); 
      dataSource.setPassword(properties.getProperty("hibernate.connection.password")); 

      dataSource.setMaxPoolSize(Integer.parseInt(properties.getProperty("hibernate.c3p0.max_size"))); 
      dataSource.setMinPoolSize(Integer.parseInt(properties.getProperty("hibernate.c3p0.min_size"))); 
      dataSource.setCheckoutTimeout(Integer.parseInt(properties.getProperty("hibernate.c3p0.timeout"))); 
      dataSource.setMaxStatements(Integer.parseInt(properties.getProperty("hibernate.c3p0.max_statements"))); 
      dataSource.setIdleConnectionTestPeriod(Integer.parseInt(properties.getProperty("hibernate.c3p0.idle_test_period"))); 
      dataSource.setAcquireIncrement(Integer.parseInt(properties.getProperty("hibernate.c3p0.acquire_increment"))); 

      return dataSource; 
     } 

     @Bean 
     public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){ 
      return new PersistenceExceptionTranslationPostProcessor(); 
     } 

     Properties additionalProperties() throws IOException { 
      Properties properties = new Properties(); 
      Properties hibernateProperties = new Properties();   
      BufferedReader input = new BufferedReader (new InputStreamReader (getClass().getResourceAsStream("/config/hibernate.properties")));     
      hibernateProperties.load(input);   
      properties.setProperty("hibernate.dialect", hibernateProperties.getProperty("hibernate.dialect")); 
      return properties; 
     } 

} 

Lorsque je tente d'exécuter j'obtiens l'erreur suivante

org.hibernate.cache.NoCacheRegionFactoryAvailableException: Second-level cache is used in the application, but property hibernate.cache.region.factory_class is not given, please either disable second level cache or set correct region factory class name to property hibernate.cache.region.factory_class (and make sure the second level cache provider, hibernate-infinispan, for example, is available in the classpath). 

I compris que je dois ajouter

<property name="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</property> 

mais je ne sais pas où et comment l'ajouter via la configuration Java. Quelqu'un peut-il aider ici s'il vous plaît.

En outre, dois-je ajouter ce qui suit?

<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property> 
<property name="hibernate.cache.use_second_level_cache">true</property> 
<property name="hibernate.cache.use_query_cache">true</property> 
+0

Votre application est-elle en cours d'exécution sans cache de second niveau? Je veux dire êtes-vous capable de sauvegarder et de récupérer les entités sans cache de second niveau? Et pourquoi voulez-vous utiliser 'CachingConfigurer'? parce que cela n'a rien à voir avec le cache de second niveau Hibernate auquel vous faites référence? –

+0

@Madhusudana Reddy Sunnapu - oui Je suis capable de récupérer sans cache de second niveau –

Répondre

1

En supposant que vous êtes en mesure de récupérer les entités et que vous voulez juste pour activer cache de second niveau:

Ajoutez les propriétés suivantes dans votre méthode additionalProperties() existante.

properties.setProperty("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory"); 
properties.setProperty("hibernate.cache.use_second_level_cache", "true"); 
properties.setProperty("hibernate.cache.use_query_cache", "true"); 

et sur la entity que vous souhaitez activer la deuxième place du cache de niveau @Cache annotation sur cette ex entité: @Cache(usage=CacheConcurrencyStrategy.READ_WRITE)

Vous pouvez supprimer CachingConfig classe comme cela n'a rien à voir avec permettant cache de second niveau pour Hibernate.

+0

merci ça a fonctionné pour moi –