文档章节

JPA使用ehcache二级缓存

trntaken
 trntaken
发布于 2017/06/16 20:06
字数 834
阅读 63
收藏 0

      在实际应用中,用于查询的数据量非常大,查询效率非常慢。为了提高查询效率,并减少对数据库的访问,一般都会使用二级缓存。二级缓存框架有很多,但hibernate默认使用的ehcache。ehcache是纯java进程的,缓存速度快,轻量级的框架。

   1.首先在build.gradle中添加cache启动器依赖:

compile('org.springframework.boot:spring-boot-starter-cache')

2.在application.yml中添加以下配置:

spring:
   jpa:
     properties:
           hibernate:
                 cache:
                     #使用二级缓存
                     use_second_level_cache: true 
                     #查询使用缓存
                     use_query_cache: true
                     #缓存的工厂类
                     region.factory_class: org.hibernate.cache.ehcache.EhCacheRegionFactory
    #查询打印sql,可验证二级缓存是否配置成功
     show-sql: true
  #配置ehcache的配置文件目录
  cache:
        ehcache:
        config: classpath:ehcache.xml

3.配置ehcache.xml

<ehcache>
  
    <diskStore path="user.dir/static"></diskStore>
  
     配置默认缓存
    <defaultCache
            maxEntriesLocalHeap="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="false"
            maxElementsOnDisk="10000000"
            diskPersistent="false"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU"
    />
    <cache name="person"
           maxEntriesLocalHeap="2000"
           eternal="false"
           timeToIdleSeconds="18000"
           timeToLiveSeconds="36000"
           overflowToDisk="false"
    />

 <!--    
        设定具体的命名缓存的数据过期策略  
        cache元素的属性:  
            name:缓存名称  
            maxEntriesLocalHeap:内存中最大缓存对象个数  
              
            maxElementsOnDisk:硬盘中最大缓存对象数,若是0表示无穷大  
              
            eternal:true表示对象永不过期,此时会忽略timeToIdleSeconds和timeToLiveSeconds属性,默认为false   
            overflowToDisk:true表示当内存缓存的对象数目达到了maxElementsInMemory界限后,会把溢出的对象写到硬盘缓存中。注意:如果缓存的对象要写入到硬盘中的话,则该对象必须实现了Serializable接口才行。  
              
            diskSpoolBufferSizeMB:磁盘缓存区大小,默认为30MB。每个Cache都应该有自己的一个缓存区。  
              
            diskPersistent:是否缓存虚拟机重启期数据  
              
            diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认为120秒  
  
            timeToIdleSeconds: 设定允许对象处于空闲状态的最长时间,以秒为单位。当对象自从最近一次被访问后,如果处于空闲状态的时间超过了timeToIdleSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清空。只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地处于空闲状态  
              
            timeToLiveSeconds:设定对象允许存在于缓存中的最长时间,以秒为单位。当对象自从被存放到缓存中后,如果处于缓存中的时间超过了 timeToLiveSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清除。只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地存在于缓存中。timeToLiveSeconds必须大于timeToIdleSeconds属性,才有意义  
  
            memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。可选策略有:LRU(最近最少使用,默认策略)、FIFO(先进先出)、LFU(最少访问次数)。  
    -->  

</ehcache>

 

3.entity中加注解:

@Cacheable()
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_ONLY,region = "person")
@Entity
public class Person{
 

}

 

 

 

4.repository加注解:

public interface PersonRepository extends JpaRepository{

 @QueryHints({ @QueryHint(name = "org.hibernate.cacheable", value ="true")}) 
public List<Person> findAll();

}

这样查询的时候,就会将结果缓存到内存里。查询方法上加QueryHint缓存才会生效。如果要对JPA接口提供(例如:JpaRepository 中的findOne)的方法使用缓存,可以在PersonRepository中覆盖父接口即可。

© 著作权归作者所有

trntaken
粉丝 3
博文 26
码字总数 34519
作品 0
深圳
程序员
私信 提问
利用 JPA 2.0 二级缓存实现高速数据访问

JPA 是 Java Persistence API 的简称,JPA 1.0 目前只支持一级缓存。JPA 2.0 在 2009 年 12 月发布,作为 Java 6 的标准,JPA 2.0 增加了对二级缓存的支持。WebSphere Application Server V7...

IBMdW
2011/06/10
2.1K
0
Spring基于注解的缓存配置--web应用实例

之前为大家介绍了如何使用spring注解来进行缓存配置 (EHCache 和 OSCache)的简单的例子,详见 Spring基于注解的缓存配置--EHCache AND OSCache 现在介绍一下如何在基于注解springMVC的web...

小样
2012/02/28
462
0
BigMemory系列文章--1.Ehcache是什么

转载请注明出处哈:http://carlosfu.iteye.com/blog/2237511 一、Ehcache背景 1. 官方文档的解释: 2. 提炼出以下几点: (1) 开源、提供多种功能和解决方案、健壮的、最流行的基于java实现的缓...

付磊-起扬
2015/08/23
0
0
在 servlet 中使用 EhCache 缓存

本文主要介绍 在纯servlet应用中 整合 EhCache 缓存的使用 1.整合EhCache首先我们要下载EhCache的架包 下载地址:http://ehcache.org/downloads/catalog 直接下载 hcache-2.7.4-distribution....

JacCoffee
2013/10/20
145
1
spring-boot jpa二级缓存以及懒加载问题!

我使用的是spring-boot应用框架,目前碰到2个问题。 1:缓存问题:目前是将hibernate作为Jpa的实现框架,cache的实现是ehcache,在application.properties里面配置了如下: 在最下一行,share...

ramus
2016/01/29
6K
5

没有更多内容

加载失败,请刷新页面

加载更多

Activity启动模式二

上篇文章Activity启动模式一主要介绍了Activity的四种启动模式,这些启动模式都是在AndroidManifest中进行配置的。除此之外,Android系统还通过Intent类提供了一些标志位,同样可以指定Activ...

ltlovezh
51分钟前
7
0
三原色还原

1、Color Filter Array — CFA 随着数码相机、手机的普及,CCD/CMOS 图像传感器近年来得到广泛的关注和应用。 图像传感器一般都采用一定的模式来采集图像数据,常用的有 BGR 模式和 CFA 模式...

天王盖地虎626
今天
7
0
kubernetes pod exec接口调用

正文 一般生产环境上由于网络安全策略,大多数端口是不能为集群外部访问的。多个集群之间一般都是通过k8s的ApiServer组件提供的接口通信,如https://192.168.1.101:6443。所以在做云平台时,...

码农实战
今天
8
0
3_数组

3_数组

行者终成事
今天
8
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部