spring + hibernate + c3p0 + ehcache java配置 [英] spring + hibernate + c3p0 + ehcache java configuration

查看:136
本文介绍了spring + hibernate + c3p0 + ehcache java配置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对spring,hibernate,c3p0&的Ehcache。我正在开发一个完全使用Java Configuration的应用程序,除了web.xml。我必须在我的应用程序中使用二级缓存。所以我添加了以下代码:

  import net.sf.ehcache.config.CacheConfiguration; 

导入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实现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();
}

}

在web.xml中添加了它as

 < 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());
返回entityManagerFactory;



public ComboPooledDataSource pooledDataSource()throws IOException {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
属性properties = new Properties();

BufferedReader input = new BufferedReader(new InputStreamReader(getClass()。getResourceAsStream(/ config / hibernate.properties)));
properties.load(input);
尝试{
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)));

返回dataSource;


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

$ b $属性additionalProperties()抛出IOException {
属性properties = new 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));
返回属性;
}

}

当我尝试运行时,我是出现以下错误:

$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ org.hibernate.cache.NoCacheRegionFactoryAvailableException:在应用程序中使用二级缓存,但属性hibernate.cache没有给出.region.factory_class,请禁用第二级缓存或将正确的区域工厂类名称设置为属性hibernate.cache.region.factory_class(并确保例如第二级缓存提供程序hibernate-infinispan可用类路径)。

我知道我必须添加

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


解决方案

假设您可以检索实体和您只需要启用二级缓存:



在现有的 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);

实体要启用二级缓存位置 @Cache 该实体的注释例如: @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)



您可以删除 CachingConfig 类,因为这与启用Hibernate的二级缓存无关。


I am new to spring, hibernate, c3p0 & ehcache. I am developing an application completely using Java Configuration except web.xml. I have to use second level cache in my app. So I added following code

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

}

In web.xml I added it as

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

My ApplicationContextConfiguration is

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

}

When I try to run I am getting following error

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 understood that I have to add

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

but not sure where and how to add it via Java configuration. Can someone help here please.

In addition, do I need to add the following?

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

解决方案

Assuming that you are able to retrieve the entities and you just want to enable second level cache:

Add following properties in your existing additionalProperties() method.

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

and on the entity you want to enable second level cache place @Cache annotation on that entity ex: @Cache(usage=CacheConcurrencyStrategy.READ_WRITE)

You can remove CachingConfig class as that has nothing to do with enabling second level cache for Hibernate.

这篇关于spring + hibernate + c3p0 + ehcache java配置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆