spring怎么配置EHCACHE

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring怎么配置EHCACHE相关的知识,希望对你有一定的参考价值。

  Ehcache
  在java项目广泛的使用。它是一个开源的、设计于提高在数据从RDBMS中取出来的高花费、高延迟采取的一种缓存方案。正因为Ehcache具有健壮性(基于java开发)、被认证(具有apache 2.0 license)、充满特色(稍后会详细介绍),所以被用于大型复杂分布式web application的各个节点中。
  1. 够快
  Ehcache的发行有一段时长了,经过几年的努力和不计其数的性能测试,Ehcache终被设计于large, high concurrency systems.
  2. 够简单
  开发者提供的接口非常简单明了,从Ehcache的搭建到运用运行仅仅需要的是你宝贵的几分钟。其实很多开发者都不知道自己用在用Ehcache,Ehcache被广泛的运用于其他的开源项目
  比如:hibernate
  3.够袖珍
  关于这点的特性,官方给了一个很可爱的名字small foot print ,一般Ehcache的发布版本不会到2M,V 2.2.3 才 668KB。
  4. 够轻量
  核心程序仅仅依赖slf4j这一个包,没有之一!
  5.好扩展
  Ehcache提供了对大数据的内存和硬盘的存储,最近版本允许多实例、保存对象高灵活性、提供LRU、LFU、FIFO淘汰算法,基础属性支持热配置、支持的插件多
  6.监听器
  缓存管理器监听器 (CacheManagerListener)和 缓存监听器(CacheEvenListener),做一些统计或数据一致性广播挺好用的
  如何使用?
  够简单就是Ehcache的一大特色,自然用起来just so easy!
  redis
  redis是在memcache之后编写的,大家经常把这两者做比较,如果说它是个key-value store 的话但是它具有丰富的数据类型,我想暂时把它叫做缓存数据流中心,就像现在物流中心那样,order、package、store、classification、distribute、end。现在还很流行的LAMP php架构 不知道和 redis+mysql 或者 redis + mongodb的性能比较(听群里的人说mongodb分片不稳定)。
  先说说reidis的特性
参考技术A RAID等级如下:
RAID0(Stripping,条带)
将多个磁盘合并成一个大的磁盘,不具有冗余,并行I/O,速度最快.RAID0亦称为带区集.它是将多个磁盘并列起来,成为一个大磁盘.在存放数据时,其将数据按磁盘的个数来进行分段,然后同时将这些数据写进这些盘中.所以,在所有的级别中,RAID0的速度是最快的.但是RAID0没有冗余功能,如果一个磁盘(物理)损坏,则所有的数据都会丢失.
理论上越多的磁盘效能就等于[单一磁盘效能]x[磁盘数],但实际上受限于总线I/O瓶颈及其它因素的影响,RAID效能会随边际递减,也就是说,假设一个磁盘的效能是50MB/秒,两个磁盘的RAID0效能约96MB/秒,三个磁盘的RAID0也许是130MB/秒而不是150MB/秒.所以,两个磁盘的RAID0最能明显感受到效能的提升.
Size = 2 * min(S1, S2)
但如果是以软件方式来实现RAID,则磁盘的空间则不见得受限于此(例如Linux Software RAID),通过软件实现可以经由不同的组合而善用所有的磁盘空间.
Size = sum of all disk本回答被提问者和网友采纳

EHCache 配置 + Spring Boot:NoCacheRegionFactoryAvailableException

【中文标题】EHCache 配置 + Spring Boot:NoCacheRegionFactoryAvailableException【英文标题】:EHCache Configuration + Spring Boot: NoCacheRegionFactoryAvailableException 【发布时间】:2015-03-04 07:46:09 【问题描述】:

我正在尝试使用基于 EHCache 的二级缓存配置 Spring Boot 应用程序。 我遇到了这个异常:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method     failed; nested exception is 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 using the     hibernate.cache.region.factory_class setting and make sure the second level cache provider (hibernate-infinispan, e.g.) is available on the classpath.
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1554)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:975)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:752)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:109)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:691)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:952)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:941)
    at com.yes.wizard.Application.main(Application.java:30)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Caused by: 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 using the hibernate.cache.    region.factory_class setting and make sure the second level cache provider (hibernate-infinispan, e.g.) is available on the classpath.
    at org.hibernate.cache.internal.NoCachingRegionFactory.buildEntityRegion(NoCachingRegionFactory.java:83)
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:364)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1859)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:852)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:845)
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:398)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:844)
    at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:152)
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:338)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1613)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1550)
    ... 20 more    

这是我的配置:

Application.class:

@EnableAutoConfiguration
@Configuration
@ComponentScan
@ImportResource(value = "/ws.xml")
public class Application 

    public static void main(String[] args) throws Exception 
        SpringApplication.run(Application.class, args);
    

CacheConfig.class:

@Configuration
@EnableCaching
public class CachingConfig implements CachingConfigurer 

    @Bean
    @Override
    public CacheManager cacheManager() 
        EhCacheCacheManager cacheManager = new EhCacheCacheManager();
        cacheManager.setCacheManager(ehCacheManagerFactoryBean().getObject());
        return cacheManager;
    

    @Bean
    @Override
    public KeyGenerator keyGenerator() 
        return new SimpleKeyGenerator();
    

    @Bean
    public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() 
        EhCacheManagerFactoryBean ehCacheManagerFactoryBean = new EhCacheManagerFactoryBean();
        ehCacheManagerFactoryBean.setConfigLocation(new ClassPathResource("ehcache.xml"));
        ehCacheManagerFactoryBean.setCacheManagerName("messageCache");
        ehCacheManagerFactoryBean.setShared(true);
        return ehCacheManagerFactoryBean;
    

我的实体:

@Entity
@XmlRootElement
@Table(name = "my_entity")
@Cacheable(value = true)
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
public class MyEntity  ... 

ehcache.xml:

<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
    <defaultCache eternal="true" maxElementsInMemory="100" overflowToDisk="false" />
    <cache name="messageCache" maxElementsInMemory="10" eternal="true" overflowToDisk="false" />
</ehcache>

这是什么原因造成的?

【问题讨论】:

Spring 缓存和 Hibernate 二级缓存是不同的东西...... EHCache 用作休眠的二级缓存,在我的情况下,我使用的是 spring data jpa(带有休眠)。那么我的困惑在哪里? 如前所述,springs 缓存抽象和为您的 JPA 提供程序使用二级缓存彼此无关。基本上,您对 Spring Caching 的设置不会做任何事情,或者至少与您遇到的错误无关。 在这里 (ehcache.org/documentation/2.8/integrations/hibernate) 您可以找到有关 EhCache 和 Hibernate 3.3 / 4.x 的一些有用的详细信息。它还显示了hibernate.cache.region.factory_class 的值。 就我而言,我忘记将我的application.yml 文件创建到grails-app/conf/(Grails 3)中 【参考方案1】:

错误信息的关键部分是:

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

您可以在 Spring Boot 的 application.properties 文件中设置 factory_class 属性。例如:

spring.jpa.properties.hibernate.cache.region.factory_class: org.hibernate.cache.ehcache.EhCacheRegionFactory

您需要使用的类名将取决于您的 EhCache 依赖项;在这种情况下,我使用了hibernate-ehcache

【讨论】:

我有相同的,但= 而不是:,这不起作用。为什么不同的属性格式?抱歉,这不是这里的问题,但多亏了你,我发现了我的问题(并且被这个问题打动了)。 您可以使用=: 来分隔属性文件中的键和值 是的,我就是这么想的。我再次尝试并工作。我之前复制的时候一定有一个有趣的角色。一切顺利!

以上是关于spring怎么配置EHCACHE的主要内容,如果未能解决你的问题,请参考以下文章

spring 配置bean 怎么使用

spring怎么配置EHCACHE

spring的配置文件怎么写

java怎么配置spring的bean

在Mybatis中使用自定义缓存ehcache

怎么配置spring-aop-4.0.xsd