2016-03-30 17 views
1

私は春、休止状態、c3p0 & ehcacheの新機能です。私はweb.xml以外のJava Configurationを使ってアプリケーションを開発しています。私は私のアプリケーションで2番目のレベルのキャッシュを使用する必要があります。だから、私はspring + hibernate + c3p0 + ehcache java設定

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

マイApplicationContextConfigurationが

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; 
     } 

} 

私はエラー

次取得しています実行しようとしているとして、これを追加しましたweb.xmlに次のコード

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(); 
    } 

} 

を追加しました

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私は

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

ではなく、必ず、どのようにJava構成を経由して、それを追加することを追加することが必要であることを理解。誰かがここで助けてください。

さらに、次のものを追加する必要がありますか?

あなたはエンティティを取得することができますし、あなただけの二次キャッシュを有効にすると仮定すると、
<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

現在アプリケーションは第2レベルのキャッシュなしで実行していますか?私はあなたがセカンドレベルのキャッシュなしでエンティティを保存して取得できることを意味しますか?そしてなぜあなたは 'CachingConfigurer'を使いたいのですか?それはあなたが参照しているHibernateの2次キャッシュとは関係がないからです。 –

+0

@Madhusudana Reddy Sunnapu - うん、私は第2レベルのキャッシュなしで取得することができる –

答えて

1

は、既存のadditionalProperties()方法で次のプロパティを追加します。

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"); 

entityあなたがセカンドレベルキャッシュの場所にそのエンティティの元に@Cache注釈を有効にするに:それは休止状態のための二次キャッシュを有効にするとは何の関係もないよう@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)

をあなたはCachingConfigクラスを削除することができます。

+0

それは私のために働いてくれてありがとう –

関連する問題