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的主要内容,如果未能解决你的问题,请参考以下文章